差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:web:wicket:websocket_disconn_handling [2018/11/02 23:50]
tony
java:web:wicket:websocket_disconn_handling [2023/06/25 09:48] (目前版本)
行 55: 行 55:
 closed event的部分我最後再說明,請讓我先說明連線偵測的部分。由於我們的操作都是屬於ajax的request,且偵測做在client有請求時才發送會比定時發送有效率;因此我們將這個檢查放在ajax請求前的事件中,主要做以下幾件事情:​ closed event的部分我最後再說明,請讓我先說明連線偵測的部分。由於我們的操作都是屬於ajax的request,且偵測做在client有請求時才發送會比定時發送有效率;因此我們將這個檢查放在ajax請求前的事件中,主要做以下幾件事情:​
   - 連線關閉時,重新建立連線;此時Wicket.WebSocket.INSTANCE未被初始化。   - 連線關閉時,重新建立連線;此時Wicket.WebSocket.INSTANCE未被初始化。
-  - 假如Wicket.WebSocket.INSTANCE有被初始化,但isWSConnected為false,代表正在建立連線中。 +  - 假如Wicket.WebSocket.INSTANCE有被初始化,但isWSConnected為false,代表正在建立連線中。我們會略過偵測動作。 
-  - 透過Wicket.WebSocket.send發送訊息給server,確認網路狀態。(詳細內容後面說明)+  - 最後是透過Wicket.WebSocket.send發送訊息給server,確認網路狀態。詳細內容後面說明
 <code javascript>​ <code javascript>​
 Wicket.Event.subscribe('/​ajax/​call/​beforeSend',​ function(jqEvent,​ attributes, jqXHR, errorThrown,​ textStatus) { Wicket.Event.subscribe('/​ajax/​call/​beforeSend',​ function(jqEvent,​ attributes, jqXHR, errorThrown,​ textStatus) {
行 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]]