服务器推送技术之pushlet

来源:互联网 发布:淘宝服务器架构设计 编辑:程序博客网 时间:2024/05/29 10:53

对pushlet开源的改造

1、拓展了一个userid属性,开启了整个架构的前后台参数传递的机制,同时修改了默认的pushlet sessionId标识,采用了servlet服务端sessionId,达到了和服务端的统 一。

2、对后台进行了URLEncoder.encode(message.getMsg(),"UTF-8")编码,前台对应decodeURIComponent(event.get("msg")解码,解决了推送中文无响应的bug


重点知识介绍

<script type="text/javascript" src="<%=path%>/javascript/ajax-pushlet-client.js"></script>
<script type="text/javascript">
PL.webRoot=sy.contextPath+"/";
PL.userId="${sessionId}"; 
PL._init(); 
PL.joinListen('/MessageFactory/getMsg');//建立链接通道
function onData(event) {
$.messager.alert("温馨提示",decodeURIComponent(event.get("msg")));
//PL.leave();// 断开链接
}
   </script>

此段初始化代码如果遇到了前有母版页和iframe的框架,需要放置在最外层



public class MessageCenterPlushlet extends EventPullSource implements Serializable{


/*
* 设置休眠时间
* */
@Override
protected long getSleepTime() {
return 3000;
}



/*
* 推送的消息
 */
@Override
protected Event pullEvent() {
Event event = Event.createDataEvent("/MessageFactory/getMsg");
    try {
event.setField("msg",  URLEncoder.encode("您的帐号已在异地登录,您被迫下线,请注意密码保护!","UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
    return event;
}
}

继承EventPullSource,并重写getSleepTime和pullEvent 即可实现静态的消息推送

这个需要配置

#source7=com.spark.common.MessageCenterPlushlet

(不太方便)


/*
* 将消息推送到指定的用户
* */
public boolean RunPull(MessageModel message,String userId){
boolean success=false;
Event event = Event.createDataEvent("/MessageFactory/getMsg");//创建消息通道     
try {
event.setField("msg",  URLEncoder.encode(message.getMsg(),"UTF-8"));
event.setField("showType", message.getShowType());
event.setField("isExecuteText",String.valueOf(message.isExecuteText()));
event.setField("shouldGologin", String.valueOf(message.isShouldGologin()));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//推送给全部用户
if(userId==null||userId.equals("")){
Dispatcher.getInstance().multicast(event); // 向所有和myevent1名称匹配的事件推送
}else{//推送给指定的用户
Dispatcher.getInstance().unicast(event,userId);// 向ID为piero的用户推送
}
return success;
}

    由服务器主动推送

    Dispatcher提供broadcast、multicast、unicast来进行消息的广播、多播和单播


  配置web.xml

<!-- pushlet配置 -->
<servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- Define the Servlet Mappings. -->
<!-- The pushlet -->
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping>





0 0
原创粉丝点击