Я использую 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 недоступен, и пытаться периодически переподключаться?