gpt4 book ai didi

java - 一些 Spring WebSocket session 永远不会断开连接

转载 作者:行者123 更新时间:2023-11-30 08:38:15 25 4
gpt4 key购买 nike

我有一个 websocket 解决方案,用于移动应用程序和 java 后端系统之间的双工通信。我正在使用带有 STOMP 的 Spring WebSockets。我已经实现了一个乒乓解决方案来保持 websockets 打开时间超过 30 秒,因为我需要比这更长的 session 。有时我会在日志中收到这些错误,这些错误似乎来自 checkSession() in Spring's SubProtocolWebSocketHandler .

server.log: 07:38:41,090 错误 [org.springframework.web.socket.messaging.SubProtocolWebSocketHandler] (ajp-http-executor-threads - 14526905) 60205 毫秒后未收到任何消息。关闭 StandardWebSocketSession[id=214a10, uri=/base/api/websocket]。

它们不是很频繁,但每天都会发生,并且 60 秒的时间似乎是合适的,因为它被硬编码到上面提到的 Spring 类中。但是在运行应用程序一段时间后,我开始收到大量这些真正长期存在的“超时”:

server.log: 00:09:25,961 错误 [org.springframework.web.socket.messaging.SubProtocolWebSocketHandler] (ajp-http-executor-threads - 14199679) 208049286 毫秒后未收到任何消息。关闭 StandardWebSocketSession[id=11a9d9, uri=/base/api/websocket]。

大约在这个时候,应用程序开始遇到问题。

我一直在尝试搜索此行为,但没有在网络上的任何地方找到它。有没有人以前见过这个问题,知道解决方案,或者可以向我解释一下?

最佳答案

我们发现了一些东西:

  1. 我们在每 30 秒运行一次的 STOMP 关卡上添加了我们自己的 ping/pong 功能。
  2. 移动客户端有一个错误,导致他们即使在进入屏幕保护模式时也会继续回复 ping。这意味着 websocket 从未关闭或超时。
  3. 在服务器收到的每条 pong 消息上,Spring 检查发现在很长一段时间内没有收到“真实”消息并触发写入日志。然后它会尝试使用以下代码关闭 websocket:

    session.close(CloseStatus.SESSION_NOT_RELIABLE);

但我怀疑这不能正确关闭 session 。即使成功了,移动客户端也会尝试重新连接。因此,当又过了 30 秒时,另一条 pong 消息将发送到服务器,导致写入另一条日志。以此类推……

解决方案是编写一些服务器端代码来关闭基于this project 的旧websockets。并且还修复了移动客户端中的错误,即使在屏幕保护程序模式下,移动客户端也会响应 ping/pong。

哦,有一点可能对其他人有好处,那就是客户永远不应该被信任,我们看到他们有时会在一毫秒内发送多个 websockets 请求,所以一定要处理这些“重复请求”方式!

关于java - 一些 Spring WebSocket session 永远不会断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36692582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com