【问题标题】:Detecting connection error and reconnection on Spring WebSocketClient在 Spring WebSocketClient 上检测连接错误并重新连接
【发布时间】:2019-06-04 07:20:01
【问题描述】:

我正在使用 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 服务器不可用并定期尝试重新连接?

【问题讨论】:

  • 当您尝试通过断开连接的套接字发送消息时,发送应该抛出一个 execption。尝试捕获此异常并重新连接套接字。
  • 我没有发送任何消息,只是接收。

标签: java spring-boot websocket spring-websocket


【解决方案1】:

所以事实证明还有另一种方法,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 秒后的重新连接尝试。

【讨论】:

  • 你有关于如何从那里重新连接的示例代码吗?
  • 只需将连接代码(在我原来的问题中)放在一个名为startConnection() 之类的方法中,然后再次调用它。保留一个标志以表明您处于reconnection 状态,这样您就不会太快地尝试多次重新连接。
  • 我在这里有点困惑,我需要处理传输错误,但在我的情况下,我的代码是服务器端......我的客户端是 JavaScript 的。您是否知道可以在服务器端的“handleTransportError”中完成的任何缓解/恢复?正在尝试断开连接...
  • @DavidFernandez 抱歉,我对 Javascript 客户端了解不多。在我的例子中,客户端是另一个监听事件的服务器端应用程序。
  • @DavidFernandez 不确定你想让我告诉你什么。我的连接代码在问题中。我只记得发生传输错误时。
猜你喜欢
  • 2012-02-11
  • 2014-03-02
  • 2020-11-05
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多