如何在Java Spring Tomcat中快速关闭无响应的websocket?

mat*_*ttm 12 java spring tomcat timeout websocket

我有一个实时应用程序,客户端使用websockets连接Spring Framework服务器,该服务器运行Spring Boot Tomcat.我希望服务器能够快速(在5秒内)检测到客户端由于网络断开或其他问题而停止响应并关闭websocket.

我试过了

  1. 将文档中描述的"配置WebSocket引擎"设置为最大会话空闲超时 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

    @Bean
    public WebSocketHandler clientHandler() {
        return new PerConnectionWebSocketHandler(ClientHandler.class);
    }
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = 
            new ServletServerContainerFactoryBean();
        container.setMaxSessionIdleTimeout(5000);
        container.setAsyncSendTimeout(5000);
        return container;
    }
    
    Run Code Online (Sandbox Code Playgroud)

我不确定这是否正确实现,因为我没有看到ServletServerContainerFactoryBean和我的一代ClientHandler之间的链接.

  1. 每2.5秒从服务器发送ping消息.通过断开网络连接手动断开客户端连接后,服务器会愉快地再发送ping超过30秒,直到出现传输错误.

  2. 同时1和2

  3. 1和2并server.session-timeout = 5在application.properties中设置

我测试这个的方法是:

  1. 将websocket从笔记本电脑客户端连接到Tomcat服务器
  2. 使用物理交换机关闭笔记本电脑上的网络连接
  3. 等待Tomcat服务器事件

Spring FrameworkTomcat服务器如何快速检测到客户端已断开连接或未响应以关闭websocket?

Hyp*_*ion 6

应用程序事件可以帮助您.

PS:注释驱动事件

PS2:我为你做了一个示例项目


mat*_*ttm 3

我最终采取的方法是实现应用程序层乒乓协议。

  • 服务器p向客户端发送带有周期的 ping 消息。
  • 客户端用 pong 消息响应每个 ping 消息。
  • 如果服务器发送多于nping 消息而未收到 pong 响应,则会生成超时事件。
  • 如果客户端没有及时收到 ping 消息,也会产生超时事件n*p。

应该有一种更简单的方法可以在底层 TCP 连接中使用超时来实现这一点。