Spring websocket 30分钟后自动关闭(超时)

Seb*_*ian 5 java websocket spring-boot

我正在尝试使用 Spring Boot (1.5.13) 实现一个 websocket。

消息传递工作正常,但大约 30 分钟后连接被服务器终止(原因 1008 -“此连接是在已结束的经过身份验证的 HTTP 会话下建立的”)。我尝试设置不同的超时,但似乎没有任何效果。

@Service
@RequiredArgsConstructor
@Slf4j
public class OCPPSocketHandler extends TextWebSocketHandler {
    @Override
    public void handleTextMessage(WebSocketSession webSocketSession, TextMessage textMessage)
        throws IOException {
      ...
    }
}

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    public static final String ENDPOINT = "/pp/v2.0";

    @Autowired
    private CustomSocketHandler socketHandler;

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(
            new CustomExceptionWebSocketHandlerDecorator(socketHandler), ENDPOINT
        )
        .setAllowedOrigins("*");
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序属性:

#6h as milliseconds
server.connection-timeout=3600000 
server.servlet.session.timeout=6h
Run Code Online (Sandbox Code Playgroud)

每 30 分钟发送一次 TextMessage (WebSocket) 以保持连接有效。

我看过这个关于会话超时的问题,但我在那里看不到解决方案

Dav*_*INO 0

如果服务器或客户端之间的任何连接被关闭,则连接可以被关闭,如果防火墙注意到已建立的连接上没有活动,则也可以被防火墙关闭。

所以你还需要在客户端检查超时。可以合理地认为,30 分钟是这种连接的默认超时,因此它在客户端使用默认值。

此外,定期检查连接状态是一个很好的设计,例如发送某种 ping(来自客户端的消息)/pong(来自服务器的响应)消息。例如,如果您每分钟执行一次,您就会了解连接状态,并且连接永远不会因不活动而关闭。