Ant*_*dez 6 javascript stomp websocket sockjs spring-websocket
我使用 Stomp over SockJS 和 Spring websockets 作为后端。有时,我的 stomp 客户端重新连接后会遇到问题(wifi 丢失、服务器关闭等)。连接已完美恢复,但过了几秒钟,我可以在浏览器网络中看到 SockJS 客户端如何尝试使用旧会话 ID 发送 xhr-streaming。后端响应关闭帧 c[1000,“走开!”] 应用程序仍然可以工作,但此问题会加载 CPU 并减慢应用程序的速度。
\n\n我可以多次关闭和启动服务器(并不总是发生)。我无法理解 SockJS 一旦重新连接(我们从 0 销毁并创建 Sockjs 实例)如何使用旧会话的 id 发送 xhr-streaming 请求(维护重新连接前的 id 会话?内存泄漏?)。我想在重新连接后保持 Sockjs 不处于任何状态,并且总是从头开始。
\n\n\n\n后端日志:
\n\n2016-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]\nRun Code Online (Sandbox Code Playgroud)\n\n客户端日志:
\n\n(新 Sessi\xc3\xb3n Id -> h2pystok,旧会话 Id -> ypsjtids)
\n\n<<< PONG\nbrowser.js:120 sockjs-client:buffered-sender send +45ms "\\n"\nbrowser.js:120 sockjs-client:buffered-sender sendSchedule +0ms 1\nbrowser.js:120 sockjs-client:ajax-based create ajax sender +2ms http://localhost/eess-services/stomp/355/h2pystok ["\\n"]\nbrowser.js:120 sockjs-client:browser:xhr POST +0ms http://localhost/eess-services/stomp/355/h2pystok/xhr_send\nws.js:216 >>> PING\nbrowser.js:120 sockjs-client:browser:xhr withCredentials +2ms\nbrowser.js:120 sockjs-client:browser:xhr readyState +18ms 4\nbrowser.js:120 sockjs-client:browser:xhr status +1ms 200\nbrowser.js:120 sockjs-client:browser:xhr finish +0ms 200 hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\no\nh\nh\nh\nh\nh\n\nbrowser.js:120 sockjs-client:receiver:xhr finish +0ms 200 hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\n\nbrowser.js:120 sockjs-client:receiver:xhr _chunkHandler +0ms 200\nbrowser.js:120 sockjs-client:receiver:xhr close +0ms network\nbrowser.js:120 sockjs-client:polling close +1ms null network undefined\nbrowser.js:120 sockjs-client:polling _scheduleReceiver +0ms\nbrowser.js:120 sockjs-client:receiver:xhr http://localhost/eess- services/stomp/266/ypsjtids/xhr_streaming +0ms\nbrowser.js:120 sockjs-client:browser:xhr POST +1ms http://localhost/eess-services/stomp/266/ypsjtids/xhr_streaming\nRun Code Online (Sandbox Code Playgroud)\n\ngithub 中存在问题:\n https://github.com/sockjs/sockjs-client/issues/308
\n\n我在生产中遇到这个问题:(\n问候。
\n\n编辑:
\n\n我找到了可能的错误在哪里。在 polling.js 中,当关闭原因是“网络”时,我看到了一种特殊处理。当网络再次调用函数_scheduleReceiver()。当我们重新连接时,就会发生无限循环。我不知道这种处理的原因是什么,但我可以尝试删除“网络”的特殊处理,一切正常。@skozin 你能试试吗?
\n\nif (!self.pollIsClosing) { if (reason === \'network\') { self._scheduleReceiver(); } } else { self.emit(\'关闭\', 代码 || 1006, 原因); self.removeAllListeners(); } }
\n\n解决方法是:
\n\nif (!self.pollIsClosing) { self.emit(\'close\', 代码 || 1006, Reason); self.removeAllListeners(); }
\n小智 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"></脚本>”