在 Spring WebSocketClient 上检测连接错误并重新连接

Detecting connection error and reconnection on Spring WebSocketClient

我正在使用 Spring 框架的 WebSocketClientWebSocketStompClient 来使用消息。设置看起来像这样:

    WebSocketClient webSocketClient = new StandardWebSocketClient();
    WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);

    //messageConverter is MappingJackson2MessageConverter
    stompClient.setMessageConverter(messageConverter);
    stompClient.setTaskScheduler(new ConcurrentTaskScheduler());

    WebSocketHttpHeaders httpHeaders = new WebSocketHttpHeaders();
    StompHeaders stompHeaders = new StompHeaders();
    //... populate authentication headers ... 

    stompClient.connect(url, httpHeaders, stompHeaders, this);

class 本身实现了 StompSessionHandlerAdapter

然后我将覆盖 afterConnected() 方法以订阅所需的目的地并且一切正常。

我也在重写 handleException(),并且我预计可能会在出现连接错误时触发。我里面有一个警告日志,所以我希望它能在发生连接错误时显示一些东西。

  @Override
  public void handleException(
      StompSession session,
      StompCommand command,
      StompHeaders headers,
      byte[] payload,
      Throwable exception) {
    logger.warn("Error on websocket session " + session.getSessionId(), exception);
  }

但是,当出现连接中断时,我没有看到任何错误。 websocket 服务器只能通过专用网络访问,所以我尝试模拟它的方式是断开 VPN,此时消息刚刚停止(没有通过 handleException() 记录异常)。重新连接 VPN 也不会自动恢复。

如何检测到 websocket 服务器不可用并尝试定期重新连接?

所以事实证明还有另一种方法,handleTransportError() 当套接字连接断开时调用它。当我覆盖它并且 websocket 服务器变得不可用时,它被正确调用。

  @Override
  public void handleTransportError(StompSession session, Throwable exception) {
    logger.warn("Error on websocket session " + session.getSessionId(), exception);

    // todo: schedule a reconnection attempt
  }

我最后做的是保留一个标志以了解客户端是否已连接。如果这是第一次断开连接,它会尝试 re-establish 连接,否则它会使用 Spring 的 ThreadPoolTaskScheduler 来安排 5 秒后的重新连接尝试。