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

时间:2019-06-04 07:20:01

标签: java spring-boot websocket spring-websocket

我正在使用Spring Framework的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);

该类本身实现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服务器不可用,并尝试定期重新连接?

1 个答案:

答案 0 :(得分:0)

因此,有另一种方法handleTransportError()在套接字连接断开时被调用。当我覆盖它并且websocket服务器不可用时,它被正确调用。

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

    // todo: schedule a reconnection attempt
  }

我最终要做的是保留一个标记,以了解客户端是否已连接。如果这是第一次断开连接,它将尝试重新建立连接,否则它将使用Spring的ThreadPoolTaskScheduler来安排5秒钟后的重新连接尝试。