差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:web:wicket:websocket_disconn_handling [2018/11/02 23:52]
tony [Handle On Client Side]
java:web:wicket:websocket_disconn_handling [2023/06/25 09:48] (目前版本)
行 68: 行 68:
   
  try {  try {
- sendPing = false; 
  Wicket.WebSocket.send('​ping'​);​  Wicket.WebSocket.send('​ping'​);​
- sendPing ​true;+ _lastSendPing ​new Date();
  } catch(e) {  } catch(e) {
  console.log(e.messsage);​  console.log(e.messsage);​
行 79: 行 78:
 });  });
 </​code>​ </​code>​
-Wicket.WebSocket.send後,有可能會發生closed,也有可能會發生error,也有可能會拋例外;這時大家可能會問:​ 為何你closed event不直接像其它案例一樣,重新建立連線就好?​ 這是由於我們希望使用者在一段時間沒任何操作後,會自動登出系統;然而重新建立連線的動作,是會延展session時間而導致不會timeout,因此我們僅在使用者有操作後的closed event才會重新建立連線。+Wicket.WebSocket.send後,有可能會發生closed,也有可能會發生error,也有可能會拋例外;這時大家可能會問:​ 為何你closed event不直接像其它案例一樣,重新建立連線就好?​ 這是由於我們希望使用者在一段時間沒任何操作後,會自動登出系統;然而重新建立連線的動作,是會延展session時間而導致不會timeout,因此我們僅在使用者有操作後的closed event才會重新建立連線。最後就是對closed event的處理:​ 
 +<code javascript>​ 
 +Wicket.Event.subscribe("/​websocket/​closed",​ function(jqEvent) { 
 + isWSConnected = false; 
 + Wicket.WebSocket.close();​ 
 + if( !_lastSendPing ) { 
 + return; 
 +
 +  
 + var isPingExpired = (new Date()- _lastSendPing) >= 10*1000; 
 + _lastSendPing = null; 
 + if( isPingExpired ){ 
 + return; 
 +
 +  
 + Wicket.WebSocket.createDefaultConnection();​ 
 +}); 
 +</​code>​ 
 +這裡搭配偵測斷線的動作,假如在send message後的10秒內發生closed,就會重新連線。這裡使用Date而不用Boolean是考慮到send message正常,但因其它原因closed時,flag為true而做了非預期的重新連線。假如send message能夠做成callback method,會比較理想,否則使用我目前的方法實做會較容易
 \\ \\
 \\ \\
-以上內容希望對大家有幫助。+希望以上內容對大家有幫助。
 ===== Reference ===== ===== Reference =====
   * [[https://​cwiki.apache.org/​confluence/​display/​WICKET/​Wicket+Native+WebSockets|Wicket Native WebSockets]]   * [[https://​cwiki.apache.org/​confluence/​display/​WICKET/​Wicket+Native+WebSockets|Wicket Native WebSockets]]