java - 使用 ping/pong 在连接丢失时断开 Websocket 会话
问题描述
我有一个 spring boot 项目,我在其中实现了 web sockets。我没有使用 STOMP,相反,我实现了一个TextWebSocketHandler
处理所有消息的方法。
为了处理网络故障时的会话断开连接,我使用了如下的 ping pong 方案,如该线程处理-连接-丢失-与-websockets中所建议的那样
- 有一个定期任务发送
PingMessage
给每个WebSocketSession
. 我为每个会话保留一个标志,指示是否收到了乒乓球。 - 在发送 ping 消息之前,我检查我是否收到了之前发送的 ping 的 pong,如果没有,则使用类的
close()
方法关闭会话WebSocketSession
- 收到 pong 消息后,我更新了会话的标志
现在的问题是当我尝试关闭一个会话时,其他会话也被关闭了。我在回调中添加了一些日志afterConnectionClosed()
,我可以看到它被触发了会话,而不是我调用close()
方法的会话。
我不确定为什么会这样。
另外,有没有其他方法可以处理网络套接字中的连接丢失
以下是与版本相关的一些信息
- Spring Boot 1.5.10.RELEASE版本
- JDK 1.8
解决方案
推荐阅读
- python - 用 glob 迭代特定目录会给我相同的有序输出 - 有可能吗?
- git - 为什么Visual Studio(git)的一个分支(从master创建)中的更改应用于master?
- flutter - 如何使用 roslib 依赖项将 Flutter App 与任何其他设备连接?
- javascript - 根据应用程序的部署方式配置 JS 前端
- c++ - Force reinterpret_cast to return nullptr
- python - 使用多个子图更改 y 轴(线性、对数、sqrt)的设置按钮,Plotly
- python - Pandas 数据框列名未按预期格式化
- active-directory - 在 Sailpoint 中配置 AD 帐户时出现以下错误
- html - 将鼠标悬停在一个 CSS 上时为其他卡片设置样式
- python - 在 Python 中,我将一个空列表分配给另一个列表进行打印,由于某种原因,它打印了列表的最后一个元素