2016-05-04 894 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>”