我正在使用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);
}
但是,当连接断开时,我看不到任何错误。 Websocket服务器只能通过专用网络访问,因此,我尝试模拟该方法的方法是断开VPN连接,此时消息仅停止(handleException()
中未记录任何异常)。重新连接VPN也不会自动恢复。
如何检测到websocket服务器不可用,并尝试定期重新连接?
答案 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秒钟后的重新连接尝试。