前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用pushlet实现消息服务端推送至客户端

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

作者头像
有一只柴犬
发布2024-01-25 10:40:32
2210
发布2024-01-25 10:40:32
举报
文章被收录于专栏:JAVA体系

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代码

代码语言:javascript
复制
package cn.ffcs.pushmessage.plushlet;

import java.io.Serializable;

import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.EventPullSource;
import nl.justobjects.pushlet.core.Session;
import nl.justobjects.pushlet.core.SessionManager;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

import cn.ffcs.pushmessage.domain.PushMessage;
import cn.ffcs.pushmessage.service.api.IPushMessageService;

@SuppressWarnings("serial")
public class MessagePlushlet implements Serializable, BeanFactoryAware{
	
	private IPushMessageService pushMessageService;
	
	public static class Plushlet extends EventPullSource{
		
		/**
		 * 设置休眠时间
		 */
		@Override
		protected long getSleepTime() {
			return 4000;
		}

		/**
	     * 创建事件
	     * 
	     * 业务部分写在pullEvent()方法中,这个方法会被定时调用。
	     */
		@Override
		protected Event pullEvent() {
			Event event = Event.createDataEvent("/message/plushlet");
			IPushMessageService pushMessageService = (IPushMessageService) getBean("cn.ffcs.pushmessage.service.impl.PushMessageServiceImpl");
			PushMessage pushMessage = pushMessageService.getById(1);
			System.out.println(event.getField("p_id") + "==================");
			System.out.println(event.getField("userId") + "==================");
			System.out.println(event.getField("p_format") + "==================");
			System.out.println(event.getSubject());
			Session[] sessions = SessionManager.getInstance().getSessions(); 
			//sessions[0].getEvent().getField("userId");
			System.out.println(sessions[0].getEvent().getField("userId"));
			event.setField("id", "1");
			return event;
		}
		
	}

	public IPushMessageService getPushMessageService() {
		return pushMessageService;
	}

	public void setPushMessageService(IPushMessageService pushMessageService) {
		this.pushMessageService = pushMessageService;
	}

	private static BeanFactory beanFactory;  
    
    public static Object getBean(String beanName) {  
         return beanFactory.getBean(beanName);  
    }  
      
    public static <T> T getBean(String beanName, Class<T> clazs) {  
         return clazs.cast(getBean(beanName));  
    }  
      
    @SuppressWarnings("static-access")
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {  
    	this.beanFactory = beanFactory;  
    }

	
	
}

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

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

Java代码

代码语言:text
复制
    <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()为弹窗显示后的声音提醒。

代码语言:javascript
复制
<body>
<div id="pop" style="display:none;">
	<style type="text/css">
	*{margin:0;padding:0;}
	#pop{background:#fff;width:260px;border:1px solid #e0e0e0;font-size:12px;position: fixed;right:10px;bottom:10px;}
	#popHead{line-height:32px;background:#f6f0f3;border-bottom:1px solid #e0e0e0;position:relative;font-size:12px;padding:0 0 0 10px;}
	#popHead h2{font-size:14px;color:#666;line-height:32px;height:32px;}
	#popHead #popClose{position:absolute;right:10px;top:1px;}
	#popHead a#popClose:hover{color:#f00;cursor:pointer;}
	#popContent{padding:5px 10px;}
	#popTitle a{line-height:24px;font-size:14px;font-family:'微软雅黑';color:#333;font-weight:bold;text-decoration:none;}
	#popTitle a:hover{color:#f60;}
	#popIntro{text-indent:24px;line-height:160%;margin:5px 0;color:#666;}
	#popMore{text-align:right;border-top:1px dotted #ccc;line-height:24px;margin:8px 0 0 0;}
	#popMore a{color:#f60;}
	#popMore a:hover{color:#f00;}
	</style>
	<div id="popHead">
	<a id="popClose" title="关闭">关闭</a>
	<h2>温馨提示</h2>
	</div>
	<div id="popContent">
	<dl>
		<dt id="popTitle"><a href="http://yanue.info/" target="_blank">这里是参数</a></dt>
		<dd id="popIntro">这里是内容简介</dd>
	</dl>
	<p id="popMore"><a href="http://yanue.info/" target="_blank">查看 »</a></p>
	</div>
</div>
<div id="jquery_jplayer_1"></div>
</body>

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

Js代码

代码语言:text
复制
  /** Return directory of this relative to document URL. */ 
  if (PL.webRoot != null) {  
  return PL.webRoot;  
     }  
  //derive the baseDir value by looking for the script tag that loaded this file 
  var head = document.getElementsByTagName('head')[0];  
  var nodes = head.childNodes;  
  for (var i = 0; i < nodes.length; ++i) {  
  var src = nodes.item(i).src;  
  if (src) {  
  var index = src.indexOf("lib/ajax-pushlet-client.js");  
  if (index >= 0) {  
                 PL.webRoot = src.substring(0, index);  
  break;  
             }  
         }  
     }  
  return PL.webRoot;  
 },  

注意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"); 取根路径了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档