Обнаружение ошибки подключения и переподключение в Spring WebSocketClient - PullRequest
0 голосов
/ 04 июня 2019

Я использую Spring Framework WebSocketClient и WebSocketStompClient для приема сообщений. Настройка выглядит примерно так:

    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);
  }

Однако, когда происходит сбой соединения, я не вижу ошибки. Сервер веб-сокетов доступен только через частную сеть, поэтому я пытаюсь смоделировать его, отключив VPN, после чего сообщения просто останавливаются (исключение не регистрируется через handleException()). Повторное подключение VPN также не возобновляется автоматически.

Как я могу обнаружить, что сервер websocket недоступен, и пытаться периодически переподключаться?

1 Ответ

0 голосов
/ 04 июня 2019

Оказывается, есть другой метод, handleTransportError(), который вызывается, когда соединение с сокетом обрывается.Когда я перезаписываю его и сервер веб-сокетов становится недоступным, он корректно вызывается.

  @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 секунд.

...