在 Spring WebSocketClient 上检测连接错误并重新连接
Detecting connection error and reconnection on Spring WebSocketClient
我正在使用 Spring 框架的 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);
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 秒后的重新连接尝试。
我正在使用 Spring 框架的 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);
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 秒后的重新连接尝试。