我正在使用Websocket、子协议STOMP以及Fallback的SockJs实现Spring Web应用程序。
目前我想实现某种会话管理,这意味着我想在服务器上维护一个通过Websocket连接到我的Spring App的客户端列表。
我目前基于https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#websocket-stomp-appplication-context-events的天真方法是,我实现了两个事件处理程序。一个用于SessionConnectedEvent,一个用于SessionDisConnectEvent。当SessionConnectedEvent到达时,我将会话添加到我的列表中,当SessionDisConnectEvent到达时,我将该会话从列表中删除。
我想知道的是:当客户端崩溃并且没有时间通知服务器它正在关闭连接时,SessionDisconnect tEvent是否也会到达?例如,如果客户端的底层操作系统出现故障。
我试图使用Windows的任务管理器来模拟这一点,并试图关闭浏览器。但我仍然可以看到SessionDisconnect tEvent被触发。这不可能是因为心跳,因为据我所知,在Spring Websocket中,乒乓机制默认每25秒触发一次。在我通过任务管理器关闭浏览器后,SessionDisconnect tEvent立即触发。
我的测试是否意味着服务器也可以检测到客户端崩溃?
好的,我想我可以自己回答。我和我的同事一起测试了它。他通过Websocket与WebApp连接,然后他关闭了Wifi连接。这花了几秒钟,但过了一会儿,Spring也识别出了丢失的连接并触发了事件。所以一切都像魅力一样工作:)