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();