Pushlets是一个开源的基于Java Servlet的开发的轻量级网页消息推送组件,这个组件最后更新时间在2015年,在后面未见有更新,因此发现很多问题都未及时解决。 在使用过程中,常出现的问题有中文消息传输问题、以及在网页中初始化组件失败的问题。
- 解决中文发送数据失败的问题,导致SessionManager的Session被removed Pushlets组件对中文传输支持一直都有问题。
为了解决这个问题,只需要在后端对需要发送的消息进行一次UrlEncoder编码。
protected void sendMsg(String userType, String userId, String msg) {
try {
//对需要传输的消息,采用URLEncoder utf-8进行编码操作
msg = URLEncoder.encode(msg,"utf-8");
} catch (UnsupportedEncodingException e) {
logger.error("不支持的编码格式:",e);
e.printStackTrace();
}
createSubject(userType + "/" + userId, msg);
}
protected void createSubject(String subject, String message){
Event event = Event.createDataEvent(subject);
logger.info(event.toString());
event.setField("message", message);
Dispatcher dispatcher = Dispatcher.getInstance();
if (dispatcher == null) {
logger.info("dispatcher为null");
}
logger.info(dispatcher.toString());
dispatcher.multicast(event);
}
在前端接收到消息后,对消息进行解码操作,就能解决中文传输的问题。
function onData(event){
//console.log(event);
var message = event.get("message");
//对消息进行解码操作,这样就可以正常显示中文内容
message = decodeURIComponent(message);
//console.log(message);
var jsonMsg = JSON.parse(message);
var msg = jsonMsg.msg;
layer.msg(msg);
//counter = counter + 1;
//setMsgAlert(jsonMsg);
}
- 解决网页初始化Pushlets组件不成功的问题
为了解决这个问题,可以在页面中添加方法,再次调用方法初始化一次Pushlets的方法即可。
//检测Pushlets通讯组件是否初始化完成
//如果未初始化成功,重新启动
var plCounter = 0;
function reloadPushlet(){
var plState = PL.state;
console.log(PL.STATE_LISTENING);
if(plState != PL.STATE_LISTENING){
var timer = setInterval(function(){
console.log("Pushlet未正常启动监听,重新调用启动监听!"+plCounter);
${loadPushlet}
plCounter = plCounter + 1;
if(plCounter > 2){//最多执行3次
clearInterval(timer);
}
},2000);
}
}
reloadPushlet();