2016-05-04 52 views
2

即時通過SockJS和Spring websockets作爲後端使用Stomp。偶爾,我的單塊客戶端重新連接後會出現問題(無線網絡丟失,服務器故障,其他問題)。連接完全恢復,但通過瀏覽器網絡可以看到幾秒鐘SockJS客戶端如何嘗試發送xhr-streaming與舊的會話ID。後端用關閉幀c響應[1000,「Go Away!」]應用程序仍然可以工作,但是這個問題會加載CPU並使應用程序變慢。SockJS - >重新連接後無限xhr-streaming呼叫

我可以關閉並啓動服務器幾次(並不總是會發生)。我不能理解SockJS是如何重新連接的(我們從0開始銷燬和創建Sockjs實例)發送xhr-streaming請求與舊會話的id(維護預重連接id會話?內存泄漏?)。我想保持它重新連接後,Sockjs沒有任何狀態,並始終從頭開始。

enter image description here

後臺日誌:

2016-05-02 21:45:01.943 DEBUG [http-nio-8090-exec-7] o.s.w.s.s.t.h.XhrStreamingTransportHandler - Connection already closed (but not removed yet) for XhrStreamingSockJsSession[id=ypsjtids] 

客戶端日誌:

(新的會話ID - > h2pystok,舊會話ID - > ypsjtids)

<<< PONG 
browser.js:120 sockjs-client:buffered-sender send +45ms "\n" 
browser.js:120 sockjs-client:buffered-sender sendSchedule +0ms 1 
browser.js:120 sockjs-client:ajax-based create ajax sender +2ms  http://localhost/eess-services/stomp/355/h2pystok ["\n"] 
browser.js:120 sockjs-client:browser:xhr POST +0ms http://localhost/eess-services/stomp/355/h2pystok/xhr_send 
ws.js:216 >>> PING 
browser.js:120 sockjs-client:browser:xhr withCredentials +2ms 
browser.js:120 sockjs-client:browser:xhr readyState +18ms 4 
browser.js:120 sockjs-client:browser:xhr status +1ms 200 
browser.js:120 sockjs-client:browser:xhr finish +0ms 200 hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 
o 
h 
h 
h 
h 
h 

browser.js:120 sockjs-client:receiver:xhr finish +0ms 200 hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 

browser.js:120 sockjs-client:receiver:xhr _chunkHandler +0ms 200 
browser.js:120 sockjs-client:receiver:xhr close +0ms network 
browser.js:120 sockjs-client:polling close +1ms null network undefined 
browser.js:120 sockjs-client:polling _scheduleReceiver +0ms 
browser.js:120 sockjs-client:receiver:xhr http://localhost/eess- services/stomp/266/ypsjtids/xhr_streaming +0ms 
browser.js:120 sockjs-client:browser:xhr POST +1ms http://localhost/eess-services/stomp/266/ypsjtids/xhr_streaming 

有github中的問題: https://github.com/sockjs/sockjs-client/issues/308

我在生產中遇到了這個問題:( Regards。

編輯:

我發現這裏是可能出現的錯誤。在polling.js中,當關閉原因是'網絡'時,我看到了一種特殊的處理方式。網絡何時再次調用函數_scheduleReceiver()。當我們重新連接發生無限循環時。我不知道這種治療的原因是什麼,但我可以嘗試刪除'網絡'的特殊處理,一切正常。 @skozin你可以試試嗎? (!self.pollIsClosing){if(reason ==='network'){self._scheduleReceiver();}} } else {self.emit('close',code || 1006,reason); self.removeAllListeners(); }}

的解決方法是:

如果(!self.pollIsClosing){self.emit( '關閉',代碼1006 ||,原因); self.removeAllListeners(); }

+0

經過幾天的測試,我發現在iOS中(Iphone 6與最新版本的iOS)無法連接。我已經解決了桌面上的無限循環,但現在我無法連接到移動設備 –

回答

0

我有同樣的問題。我的應用程序運行在安全的「https://」上,因爲我試圖從「不安全的CDN位置」獲取sockjs-0.3.min.js,該位置無法下載.js文件。這導致它在斷開套接字時尋找Xhr_Streaming而不是我的sockjs方法。 涉及到http和https一些參考: https://developers.google.com/web/fundamentals/security/prevent-mixed-content/fixing-mixed-content

我通過改變 「無擔保CDN道路安全CDN路徑」,即修復了這個問題,

「<腳本SRC =」 HTTPS://cdn.jsdelivr .net/sockjs/0.3.4/sockjs.min.js「> </script>」