網上找到不少相關例子,不過大部分是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對象。