`

使用quartz定时器框架结合DWR框架推送信息

阅读更多

项目需求:后台新增功能,直接从服务器推送信息,提示后台人员还有未完成任务。
一直参考网上的代码,今天也做回贡献,把这个礼拜自己写的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什么的,那就自己下把。

  • dwr.jar (842.1 KB)
  • 下载次数: 0
分享到:
评论

相关推荐

    Java定时器框架(Quartz)

    在实际开发中,结合Spring框架使用Quartz可以简化集成过程,通过Spring的`@Scheduled`注解可以更方便地定义定时任务,而无需直接操作Quartz API。不过,对于需要更精细控制的任务调度,直接使用Quartz API则更为灵活...

    Quartz定时器介绍与简单使用

    ### Quartz定时器介绍与简单使用 #### 1.1 Quartz介绍 Quartz 是一款功能强大的开源任务调度框架,它完全采用 Java 编写而成。该框架允许开发人员以灵活的方式定义作业及其触发规则,从而实现对任务的定时调度。...

    quartz定时器源码jar包下载

    在实际项目中,你可以结合Spring框架集成Quartz,以简化配置和管理。 在提供的压缩包中,包含了Quartz的全套jar包,这将是你学习的宝贵资源。建议先通过官方文档或在线教程了解Quartz的基本用法,然后对照源码进行...

    Spring Quartz 定时器示例(Web工程版)

    Spring Quartz 定时器示例(Web工程版),欢迎下载。

    quartz定时器不依赖任何框架

    Quartz不依赖任何特定的Web或应用服务器框架,因此可以独立使用,这正是"quartz定时器不依赖任何框架"这个主题的核心所在。 Quartz的主要特点包括: 1. **灵活性**:Quartz提供了丰富的API,可以方便地创建、调度...

    Quartz定时器从入门到进阶

    Quartz定时器是一个开源的作业调度框架,专为J2SE和J2EE应用程序设计,完全用Java编写。它的核心优势在于提供强大的灵活性和简单性,使得开发者可以轻松创建简单的或复杂的任务调度。Quartz支持多种特性,如数据库...

    [Quartz]Quartz定时器的j2ee系统使用

    Quartz的Hibernate模型 博文链接:https://xmkevinchen.iteye.com/blog/196392

    quartz定时器api

    Quartz定时器API是Java平台上一个强大的作业调度框架,它被广泛用于构建自动化任务和后台作业,例如数据备份、报表生成、系统维护等。Quartz提供了丰富的API来创建、管理和控制作业(Jobs)和触发器(Triggers),...

    Spring Quartz定时器的jar包

    Spring Quartz定时器是Java开发中常用的一个任务调度框架,它结合了Spring框架的强大功能与Quartz的灵活性,使得开发者能够方便地在应用中实现定时任务。在这个压缩包中,包含了三个核心的jar文件:`quartz-all-...

    Quartz定时器表.sql

    Quartz定时器表 执行语句 方便部署处理数据

    java Spring OpenSymphony的Quartz定时器的时间设置

    在Java Spring框架中,开发者有多种选择来实现定时任务的功能,其中最为流行的两种方式分别是使用Java自带的`Timer`类以及OpenSymphony的Quartz定时器。本文将重点探讨Quartz定时器的配置与使用,尤其是其时间设置的...

    Quartz定时器表

    mySQL数据库Quartz定时器表,mySQL数据库Quartz定时器表,mySQL数据库Quartz定时器表,mySQL数据库Quartz定时器表

    Quartz定时器事例

    - 创建数据库表并配置相关的数据源,因为Quartz默认使用JDBC存储Job和Trigger信息。 - 初始化Scheduler,设置工厂类和配置文件路径。 4. **创建Job** - 实现`org.quartz.Job`接口或继承`org.quartz.StatefulJob`...

    一个简单的quartz定时器的demo

    这个"一个简单的quartz定时器的demo"是展示如何在项目中集成和使用Quartz的基本步骤,包括创建任务、配置调度器以及管理任务的生命周期。 首先,Quartz的核心组件包括Scheduler(调度器)、Job(任务)和Trigger...

    Quartz定时器,表达式自动生成工具

    Quartz定时器是一款广泛应用于Java开发中的开源任务调度框架,其功能强大且灵活,能够帮助开发者轻松实现定时任务的管理。在Java应用中,我们常常需要执行一些周期性的任务,如数据备份、清理缓存或者发送邮件等,而...

    定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)

    本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...

    spring boot集成quartz定时器

    Quartz 是一个开源的任务调度框架,可以用于创建、管理和执行计划任务。本文将详细讲解如何在Spring Boot项目中集成Quartz定时器,以及如何利用Spring的依赖注入特性来实现Job。 一、集成Quartz定时器 1. 添加依赖...

    quartz定时器2.2.1JAR包

    Quartz定时器是一款开源的、功能强大的作业调度框架,它为Java应用程序提供了精确且可扩展的任务调度能力。在Java世界中,Quartz以其灵活性、稳定性和广泛的社区支持而备受推崇。2.2.1版本是Quartz的一个稳定版本,...

    quartz定时器配置与jar包

    本资料包将详细介绍如何在Spring框架中配置和使用Quartz定时器,并涉及到cron表达式的使用。 一、Quartz简介 Quartz是一个完全由Java编写的作业调度框架,能够精确地调度任务,支持简单或复杂的调度需求。Quartz的...

Global site tag (gtag.js) - Google Analytics