DWR3.0+Spring2.5實現Comet服務器到瀏覽器的消息推送

網上找到不少相關例子,不過大部分是dwr2的例子,效果一般,研究了一下dwr3.0相關內容,做了個DEMO,實現了向一個或多個精確目標推送內容。

重點在於向ScriptSessionManager中加入ScriptSessionListener監聽ScriptSession的創建和銷燬。

ScriptSessionListener中有2個需要實現的方法sessionCreated和sessionDestroyed,分別對應ScriptSession的創建和銷燬,可以在方法中加入需要的內容。

 

我是在web.xml中配置了一個啓動自動運行的servlet,用來添加監聽。

InitScriptSession.java

 

在sessionCreated方法中把當前登陸人ID標識放入ScriptSession中,後面的推送過程中通過該標識判斷推送目標。

 

推送方法:

 

其他方法與網上查到的基本大同小異,有需要的朋友可以去網上down下來研究下。

 

重點關於解決頁面每刷新一次會多創建一個新的ScriptSession的解決方法

由於ScriptSession的創建機制不同於HttpSession,它會在每次頁面刷新的時候都會重新創建,而銷燬機制卻是失去連接或者失效之後一定時間纔會自動銷燬,這樣就可能造成服務端可能就保存了很多的無用的ScriptSession,所以不僅僅會影響性能問題,更重要的是,可能就不能實現你想要的功能。
解決方法是在接收消息的頁面,也就是你調用dwr.engine.setActiveReverseAjax(true);的頁面調用一個dwr的方法。

 

dwr.engine.setNotifyServerOnPageUnload(true);

 

這個方法的功能就是在銷燬或刷新頁面時銷燬當前ScriptSession,這樣就保證了服務端獲取的ScriptSession集合中沒有無效的ScriptSession對象。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章