使用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什么的,那就自己下把。

你可能感兴趣的:(quartz,DWR3,服务器推送客户端)