项目需求:后台新增功能,直接从服务器推送信息,提示后台人员还有未完成任务。
一直参考网上的代码,今天也做回贡献,把这个礼拜自己写的DWR推送信息给大家分享分享。
1.在web.xml里面增加
<listener>
<listener-class>com.quartz.JobManager</listener-class>
</listener>
监听器,使其跟着项目一起启动。
2.JobManager的类
public class JobManager implements ServletContextListener{
Scheduler scheduler=null;
public void start(){
JobDetail jobDetail=JobBuilder.newJob(Myjob.class).withIdentity("myjob", "job-group").build();
CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity("cronTrigger", "trigger-group")
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")).build();
SchedulerFactory sFactory=new StdSchedulerFactory();
try {
scheduler=sFactory.getScheduler();
scheduler.scheduleJob(jobDetail,cronTrigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JobManager manager=new JobManager();
manager.start();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
try {
if(scheduler!=null) scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
start();
}
}
其中10就是每隔10秒运行一次。
3.Myjob类
public class Myjob implements Job{
private Session session=SessionUtil.getSession();
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//这里就是需要推送的信息。我的是从数据库查询还有未完成的信息,然后自己封装
MessagePush push=new MessagePush();
push.send(getMsg());
}
getMsg()这个方法是我写在这个类里面的私有方法,设计到公司数据,不好写出来。
private Map<String,List<Object[]>> getMsg(){
//查询数据
}
}
以上就是quartz的简单使用。
4.接下来在web.xml上配置
<listener>
<listener-class>org.directwebremoting.servlet.DwrListener</listener-class>
</listener>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>initApplicationScopeCreatorsAtStartup</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jsonpEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>3000</param-value>
</init-param>
<init-param>
<param-name >org.directwebremoting.extend.ScriptSessionManager</param-name>
<param-value >com.dwr.DWRScriptSessionManager</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
有些可能不需要。不过写着也没错,比较是后台嘛,性能什么的没关系。
5.DWRScriptSessionListener类
public class DWRScriptSessionListener implements ScriptSessionListener{
//维护一个Map key为session的Id, value为ScriptSession对象
public static Map<String, ScriptSession> scriptSessionMap = new HashMap<String, ScriptSession>();
@Override
public void sessionCreated(ScriptSessionEvent event) {
WebContext webContext = WebContextFactory. get();
HttpSession session = webContext.getSession();
ScriptSession scriptSession = event.getSession();
scriptSessionMap.put(session.getId(), scriptSession); //添加scriptSession
//System. out.println("[新增]session: " + session.getId() + "> scriptSession: " + scriptSession.getId() + "is created!");
}
@Override
public void sessionDestroyed(ScriptSessionEvent event) {
WebContext webContext = WebContextFactory. get();
HttpSession session = webContext.getSession();
ScriptSession scriptSession = scriptSessionMap.remove(session.getId()); //移除scriptSession
//System. out.println("[删除]session: " + session.getId() + " scriptSession: " + scriptSession.getId() + "is destroyed!");
}
public static Collection<ScriptSession> getScriptSessions(){
return scriptSessionMap.values();
}
}
6.DWRScriptSessionManager类
public class DWRScriptSessionManager extends DefaultScriptSessionManager{
public DWRScriptSessionManager(){
//绑定一个ScriptSession增加销毁事件的监听器
this.addScriptSessionListener(new DWRScriptSessionListener());
}
}
7.MessagePush类
public class MessagePush{
private String sessionTag="tag";
private Session session=SessionUtil.getSession();
private List list=getPromission();
public void onPageLoad(final String tag){
//获取当前的ScriptSession
ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
scriptSession.setAttribute(sessionTag, tag);
}
public void send(Map<String,List<Object[]>> msg){
String content="";
if(msg!=null && msg.size()>0) content=JSONArray.fromObject(msg).toString();
sent(content);
}
public void sent(final String content){
Object teg=null;
Collection<ScriptSession> temp=new ArrayList<ScriptSession>();
Collection<ScriptSession> sessions = DWRScriptSessionListener.getScriptSessions();
if(sessions.size()>0){
for (ScriptSession scriptSession : sessions){
teg=scriptSession.getAttribute(sessionTag);
if(teg==null || "".equals(teg)){
temp.add(scriptSession);
continue;
}
if(!isShow(scriptSession.getAttribute(sessionTag)+"")){
temp.add(scriptSession);
continue;
}
}
sessions.removeAll(temp);
}else return;
if(sessions.size()<=0) return;
ScriptSessionFilter filter = new ScriptSessionFilter() {
@Override
public boolean match(ScriptSession scriptSession) {
if(scriptSession==null) return false;
String tag=null;
try{
Object obj=scriptSession.getAttribute(sessionTag);
if(obj==null || "".equals(obj)) return false;
tag=obj.toString();
}catch(Exception e){
e.getStackTrace();
return false;
}
boolean compale=isShow(tag.trim());
return compale;
}
};
Runnable run = new Runnable(){
private ScriptBuffer script = new ScriptBuffer();
@Override
public void run() {
//设置要调用的 js及参数
script.appendCall("show", content);
//得到所有ScriptSession
Collection<ScriptSession> sessions = DWRScriptSessionListener.getScriptSessions();
//遍历每一个ScriptSession
for (ScriptSession scriptSession : sessions){
scriptSession.addScript(script);
}
}
};
//执行推送
Browser.withAllSessionsFiltered(filter,run);
}
//和需要推送的用户去比对。
public boolean isShow(String tag){
if(list==null) return false;
for(Object obj:list.toArray()){
if(obj.equals(tag)) return true;
}
return false;
}
private List getPromission(){
//此方法是获取某某权限下的所有用户。然后和需要推送的用户去比对。
//和上个方法一样涉及公司数据库就不写了。
}
}
8.然后在和web.xml同目录下新建dwr.xml
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="MessagePush">
<param name="class" value="com.dwr.MessagePush"/>
</create>
</allow>
</dwr>
9.接下来就是页面上引用DWR的JS了,我的是在公共的底部引用的。
<script type="text/javascript" src="${ctx }/dwr/engine.js"></script>
<script type="text/javascript" src="${ctx }/dwr/util.js"></script>
<script type="text/javascript" src="${ctx }/dwr/interface/MessagePush.js"></script>
注意:
A.${ctx }是项目跟路径。如何判断是否引用进来了,直接右击查看源码,然后直接点击链接,如果有JS的内容说明引进来了。
B.MessagePush.js的MessagePush一定要和类MessagePush的名称一样。这三个JS 都是自动生成的不要去下载。
10.最后是在页面上写JS了。
<script>
//这个方法用来启动该页面的ReverseAjax功能
dwr.engine.setActiveReverseAjax(true);
//设置在页面关闭时,通知服务端销毁会话
dwr.engine.setNotifyServerOnPageUnload(true);
//指定用户
var user=jQuery("#dwrUserName").text();
MessagePush.onPageLoad(user);//这个方法是给scriptSession赋值的,用来控制指定给某某用户显示的。
var language=1;//这个是国家化用的。
//这个函数是提供给后台推送的时候 调用的
function show(data){
if(!data){//说明没有信息了,就不执行了。
return;
}
var msg=eval("("+data+")");//转换为json对象
var ary=(msg[0][language]);
msg="";
for(var i=0;i<ary.length;i++){
msg+="<dd id='popIntro'>"+dobylanguage(ary[i][1],ary[i][0])+"</dd>";
}
jQuery("#handle").html(msg);
soundManager.onclick();//这个是右下角弹框的时候,加的提示声音。
}
//注: show()方法是具体内容处理方式。不需要在意细节。
</script>
好了就到此为止了。
可能还需要log4j什么的,那就自己下把。
相关推荐
在实际开发中,结合Spring框架使用Quartz可以简化集成过程,通过Spring的`@Scheduled`注解可以更方便地定义定时任务,而无需直接操作Quartz API。不过,对于需要更精细控制的任务调度,直接使用Quartz API则更为灵活...
### Quartz定时器介绍与简单使用 #### 1.1 Quartz介绍 Quartz 是一款功能强大的开源任务调度框架,它完全采用 Java 编写而成。该框架允许开发人员以灵活的方式定义作业及其触发规则,从而实现对任务的定时调度。...
在实际项目中,你可以结合Spring框架集成Quartz,以简化配置和管理。 在提供的压缩包中,包含了Quartz的全套jar包,这将是你学习的宝贵资源。建议先通过官方文档或在线教程了解Quartz的基本用法,然后对照源码进行...
Spring Quartz 定时器示例(Web工程版),欢迎下载。
Quartz不依赖任何特定的Web或应用服务器框架,因此可以独立使用,这正是"quartz定时器不依赖任何框架"这个主题的核心所在。 Quartz的主要特点包括: 1. **灵活性**:Quartz提供了丰富的API,可以方便地创建、调度...
Quartz定时器是一个开源的作业调度框架,专为J2SE和J2EE应用程序设计,完全用Java编写。它的核心优势在于提供强大的灵活性和简单性,使得开发者可以轻松创建简单的或复杂的任务调度。Quartz支持多种特性,如数据库...
Quartz的Hibernate模型 博文链接:https://xmkevinchen.iteye.com/blog/196392
Quartz定时器API是Java平台上一个强大的作业调度框架,它被广泛用于构建自动化任务和后台作业,例如数据备份、报表生成、系统维护等。Quartz提供了丰富的API来创建、管理和控制作业(Jobs)和触发器(Triggers),...
Spring Quartz定时器是Java开发中常用的一个任务调度框架,它结合了Spring框架的强大功能与Quartz的灵活性,使得开发者能够方便地在应用中实现定时任务。在这个压缩包中,包含了三个核心的jar文件:`quartz-all-...
Quartz定时器表 执行语句 方便部署处理数据
在Java Spring框架中,开发者有多种选择来实现定时任务的功能,其中最为流行的两种方式分别是使用Java自带的`Timer`类以及OpenSymphony的Quartz定时器。本文将重点探讨Quartz定时器的配置与使用,尤其是其时间设置的...
mySQL数据库Quartz定时器表,mySQL数据库Quartz定时器表,mySQL数据库Quartz定时器表,mySQL数据库Quartz定时器表
- 创建数据库表并配置相关的数据源,因为Quartz默认使用JDBC存储Job和Trigger信息。 - 初始化Scheduler,设置工厂类和配置文件路径。 4. **创建Job** - 实现`org.quartz.Job`接口或继承`org.quartz.StatefulJob`...
这个"一个简单的quartz定时器的demo"是展示如何在项目中集成和使用Quartz的基本步骤,包括创建任务、配置调度器以及管理任务的生命周期。 首先,Quartz的核心组件包括Scheduler(调度器)、Job(任务)和Trigger...
Quartz定时器是一款广泛应用于Java开发中的开源任务调度框架,其功能强大且灵活,能够帮助开发者轻松实现定时任务的管理。在Java应用中,我们常常需要执行一些周期性的任务,如数据备份、清理缓存或者发送邮件等,而...
本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...
Quartz 是一个开源的任务调度框架,可以用于创建、管理和执行计划任务。本文将详细讲解如何在Spring Boot项目中集成Quartz定时器,以及如何利用Spring的依赖注入特性来实现Job。 一、集成Quartz定时器 1. 添加依赖...
Quartz定时器是一款开源的、功能强大的作业调度框架,它为Java应用程序提供了精确且可扩展的任务调度能力。在Java世界中,Quartz以其灵活性、稳定性和广泛的社区支持而备受推崇。2.2.1版本是Quartz的一个稳定版本,...
本资料包将详细介绍如何在Spring框架中配置和使用Quartz定时器,并涉及到cron表达式的使用。 一、Quartz简介 Quartz是一个完全由Java编写的作业调度框架,能够精确地调度任务,支持简单或复杂的调度需求。Quartz的...