使用pushlet实现消息服务端推送至客户端

1、基础概念:Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。

2、一个简单的demo:

1)导入所需要的jar包:pushlet.jar

2)将配置文件pushlet.properties、sources.properties导入到src目录下

pushlet.properties:

config.version=1.0.2
controller.class=nl.justobjects.pushlet.core.Controller
dispatcher.class=nl.justobjects.pushlet.core.Dispatcher
logger.class=nl.justobjects.pushlet.util.Log4jLogger
sessionmanager.class=nl.justobjects.pushlet.core.SessionManager
session.class=nl.justobjects.pushlet.core.Session
subscriber.class=nl.justobjects.pushlet.core.Subscriber
subscription.class=nl.justobjects.pushlet.core.Subscription
log.level=4
sources.activate=true
session.id.generation=randomstring
session.timeout.mins=5
queue.size=24
queue.read.timeout.millis=20000
queue.write.timeout.millis=20
listen.force.pull.all=false
listen.force.pull.agents=safari
pull.refresh.timeout.millis=45000
pull.refresh.wait.min.millis=2000
pull.refresh.wait.max.millis=6000
poll.refresh.timeout.millis=60000
poll.refresh.wait.min.millis=6000
poll.refresh.wait.max.millis=10000


source.properties:

source6=cn.ffcs.pushmessage.plushlet.MessagePlushlet$Plushlet

3)修改web.xml文件如下(url-pattern暂时设置为/pushlet.srv

Xml代码   收藏代码
  1. <servlet-name>pushlet</servlet-name>  
  2.     <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>  
  3.     <load-on-startup>1</load-on-startup>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>pushlet</servlet-name>  
  7.     <url-pattern>/pushlet.srv</url-pattern>  
  8. </servlet-mapping>  

   4)编写一个java类如下

Java代码  
 
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package cn.ffcs.pushmessage.plushlet;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import nl.justobjects.pushlet.core.Event;  
  6. import nl.justobjects.pushlet.core.EventPullSource;  
  7. import nl.justobjects.pushlet.core.Session;  
  8. import nl.justobjects.pushlet.core.SessionManager;  
  9.   
  10. import org.springframework.beans.BeansException;  
  11. import org.springframework.beans.factory.BeanFactory;  
  12. import org.springframework.beans.factory.BeanFactoryAware;  
  13.   
  14. import cn.ffcs.pushmessage.domain.PushMessage;  
  15. import cn.ffcs.pushmessage.service.api.IPushMessageService;  
  16.   
  17. @SuppressWarnings("serial")  
  18. public class MessagePlushlet implements Serializable, BeanFactoryAware{  
  19.       
  20.     private IPushMessageService pushMessageService;  
  21.       
  22.     public static class Plushlet extends EventPullSource{  
  23.           
  24.         /** 
  25.          * 设置休眠时间 
  26.          */  
  27.         @Override  
  28.         protected long getSleepTime() {  
  29.             return 4000;  
  30.         }  
  31.   
  32.         /** 
  33.          * 创建事件 
  34.          *  
  35.          * 业务部分写在pullEvent()方法中,这个方法会被定时调用。 
  36.          */  
  37.         @Override  
  38.         protected Event pullEvent() {  
  39.             Event event = Event.createDataEvent("/message/plushlet");  
  40.             IPushMessageService pushMessageService = (IPushMessageService) getBean("cn.ffcs.pushmessage.service.impl.PushMessageServiceImpl");  
  41.             PushMessage pushMessage = pushMessageService.getById(1);  
  42.             System.out.println(event.getField("p_id") + "==================");  
  43.             System.out.println(event.getField("userId") + "==================");  
  44.             System.out.println(event.getField("p_format") + "==================");  
  45.             System.out.println(event.getSubject());  
  46.             Session[] sessions = SessionManager.getInstance().getSessions();   
  47.             //sessions[0].getEvent().getField("userId");  
  48.             System.out.println(sessions[0].getEvent().getField("userId"));  
  49.             event.setField("id""1");  
  50.             return event;  
  51.         }  
  52.           
  53.     }  
  54.   
  55.     public IPushMessageService getPushMessageService() {  
  56.         return pushMessageService;  
  57.     }  
  58.   
  59.     public void setPushMessageService(IPushMessageService pushMessageService) {  
  60.         this.pushMessageService = pushMessageService;  
  61.     }  
  62.   
  63.     private static BeanFactory beanFactory;    
  64.       
  65.     public static Object getBean(String beanName) {    
  66.          return beanFactory.getBean(beanName);    
  67.     }    
  68.         
  69.     public static <T> T getBean(String beanName, Class<T> clazs) {    
  70.          return clazs.cast(getBean(beanName));    
  71.     }    
  72.         
  73.     @SuppressWarnings("static-access")  
  74.     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {    
  75.         this.beanFactory = beanFactory;    
  76.     }  
  77.   
  78.       
  79.       
  80. }  

   还有就是注意Event event = Event.createDataEvent("/message/plushlet");// 事件标识

 

5)编写jsp文件如下<%@ page language="java" contentType="text/html; charset=UTF-8"

Java代码   收藏代码
  1.     <script type="text/javascript" src="/scripts/jquery.min.js"></script>
    <script type="text/javascript" src="/scripts/ajax-pushlet-client.js"></script>
    <script src="/scripts/yanue.pop.js"  type="text/javascript"></script>
    <script type="text/javascript" src="/scripts/jquery.jplayer.min.js"></script>
    <script type="text/javascript"> 

            //对pushlet的初始化,触发web.xml中的servlet。
            PL._init(); 
            //这里的监听的主题,必须在sources.properties中配置的对象中声明这个主题。
            //sources.properties配置着事件源(EventSources),在服务器启动时会自动激活。
            //可以通过服务器的启动记录查看得到。可以将这个文件放到WEB-INF目录下面或者classess目录下面都可以。
            //PL.parameters.push({"userId":"1", "value":"4214f0c0da6760a9e95e3c164998ac06"});  
            PL.joinListen('/message/plushlet'); 
            function onData(event) {
            //alert('123'); 
            //event.setField("userId","123");
            var pop=new Pop("这里是标题,哈哈",
            "http://www.yanue.info/js/pop/pop.html",
            "请输入你的内容简介,这里是内容简介.请输入你的内容简介,这里是内容简介.请输入你的内容简介,这里是内容简介");
                
                getRingData();
            } 
            //onData();
            
             function getRingData(){
            //alert('123');
       var attachmentUrl = "http://localhost:8080/upload/ring/1394107276542.mp3";
       $('#jqDiv div').remove();    //将jplayer渲染的div层移除后重新添加,不然jplayer只会播放一次
    $('#jqDiv').append('<div id="jquery_jplayer_1" class="jp-jplayer" style="width:500px;"></div>');
    $("#jquery_jplayer_1").jPlayer("stop");
    $("#jquery_jplayer_1").jPlayer({
    ready: function (event) {
    $(this).jPlayer("setMedia", {
    mp3:attachmentUrl
    }).jPlayer("play");
    },
    swfPath: "js",
    supplied: "m4a, oga, mkv, mp3, mp4",
    wmode: "window"
    });
    }
            
    </script>
<div id="jqDiv">
<div id="jquery_jplayer_1" class="jp-jplayer" style="width:500px;"></div>
</div>
  1.  

   PL.joinListen('/message/plushlet');//事件标识 在数据源中引用,注意跟上面的红色部分保持一致。

   调用getRingData()为弹窗显示后的声音提醒。

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2. <div id="pop" style="display:none;">  
  3.     <style type="text/css">  
  4.     *{margin:0;padding:0;}  
  5.     #pop{background:#fff;width:260px;border:1px solid #e0e0e0;font-size:12px;position: fixed;right:10px;bottom:10px;}  
  6.     #popHead{line-height:32px;background:#f6f0f3;border-bottom:1px solid #e0e0e0;position:relative;font-size:12px;padding:0 0 0 10px;}  
  7.     #popHead h2{font-size:14px;color:#666;line-height:32px;height:32px;}  
  8.     #popHead #popClose{position:absolute;right:10px;top:1px;}  
  9.     #popHead a#popClose:hover{color:#f00;cursor:pointer;}  
  10.     #popContent{padding:5px 10px;}  
  11.     #popTitle a{line-height:24px;font-size:14px;font-family:'微软雅黑';color:#333;font-weight:bold;text-decoration:none;}  
  12.     #popTitle a:hover{color:#f60;}  
  13.     #popIntro{text-indent:24px;line-height:160%;margin:5px 0;color:#666;}  
  14.     #popMore{text-align:right;border-top:1px dotted #ccc;line-height:24px;margin:8px 0 0 0;}  
  15.     #popMore a{color:#f60;}  
  16.     #popMore a:hover{color:#f00;}  
  17.     </style>  
  18.     <div id="popHead">  
  19.     <a id="popClose" title="关闭">关闭</a>  
  20.     <h2>温馨提示</h2>  
  21.     </div>  
  22.     <div id="popContent">  
  23.     <dl>  
  24.         <dt id="popTitle"><a href="http://yanue.info/" target="_blank">这里是参数</a></dt>  
  25.         <dd id="popIntro">这里是内容简介</dd>  
  26.     </dl>  
  27.     <p id="popMore"><a href="http://yanue.info/" target="_blank">查看 »</a></p>  
  28.     </div>  
  29. </div>  
  30. <div id="jquery_jplayer_1"></div>  
  31. </body>  


6)下面说一下web.xml中<url-pattern>的配置问题,查看ajax-pushlet-client.js源码会发现有下面这段代码_getWebRoot: function() {

Js代码   收藏代码
  1.     /** Return directory of this relative to document URL. */  
  2.     if (PL.webRoot != null) {  
  3.         return PL.webRoot;  
  4.     }  
  5.     //derive the baseDir value by looking for the script tag that loaded this file  
  6.     var head = document.getElementsByTagName('head')[0];  
  7.     var nodes = head.childNodes;  
  8.     for (var i = 0; i < nodes.length; ++i) {  
  9.         var src = nodes.item(i).src;  
  10.         if (src) {  
  11.             var index = src.indexOf("lib/ajax-pushlet-client.js");  
  12.             if (index >= 0) {  
  13.                 PL.webRoot = src.substring(0, index);  
  14.                 break;  
  15.             }  
  16.         }  
  17.     }  
  18.     return PL.webRoot;  
  19. },  
 注意var index = src.indexOf("lib/ajax-pushlet-client.js");这句话 这个方法就是取webRoot跟路径的,所以<url-pattern>的设置跟这里有关系,还有就是跟你使用ajax-pushlet-client.js的jsp页面有关系,我上面的jsp页面中src="js/ajax-pushlet-client.js"是这样导入js包的,所以我把ajax-pushlet-client.js中的代码改为 var index = src.indexOf("js/ajax-pushlet-client.js"); 取根路径了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。 server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使 Pushlet服务器端Java类UML图 Pushlet服务器端Java类UML图 用采用RMI、CORBA或者自定义TCP/IP信息的applet实现。这些技术往往由于复杂而产生诸多不利之处:技术难以实现、存在防火墙限制(因为需要打开非HTTP的通讯端口)、需要额外的server开发和维护。并且除了刷新整个页面或者完全采用applet展示内容之外,很难找到别的方法将client端applet的状态和浏览器的页面内容集成在一起。 Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式相悖。浏览器client为兼容JavaScript1.4版本以上的浏览器(如Internet Explorer、FireFox),并使用JavaScript/Dynamic HTML特性。而底层实现使用一个servlet通过Http连接到JavaScript所在的浏览器,并将数据推送到后者。有关JavaScript版本的知识请参看Mozilla开发中心提供的《JavaScript核心参考》和Stephen Chapman编写的《What Version of Javascript》。 这种机制是轻量级的,它使用server端的servlet连接管理、线程工具、javax.servlet API,并通过标准Java特性中Object的wait()和notify()实现的生产者/消费者机制。原则上,Pushlet框架能够运行在任何支持servlet的server上、防火墙的后面。当在client中使用JavaScript/DHTML时,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值