转自https://blog.youkuaiyun.com/u013174217/article/details/53376793
websocketstompclient端实现和服务端建立连接和通信之后,如果服务端断开或重启,client端需要实现自动定时重连机制。
查阅了官网和一些资料没有找到相关的源码,自己写了个:
在client端重写StompSessionHandlerAdapter的类中重写handleTransportError方法:
- @Override
- public void handleTransportError(StompSession session, Throwable exception) {
- if (exception instanceof ConnectionLostException || !isConnected) {
- // if connection lost, call this
- isConnected = false;
- while (!isConnected) try {
- Thread.sleep(5000);
- //new connect--start
- WebSocketClient webSocketClient = new SockJsClient(transports);
- WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
- stompClient.setInboundMessageSizeLimit(size);
- stompClient.setMessageConverter(new MappingJackson2MessageConverter());
- stompClient.setTaskScheduler(new DefaultManagedTaskScheduler()); // for heartbeats
- stompClient.connect(url, wsHeaders, sessionHandler);
- //new connect--end
- isConnected = true;
- } catch (Exception e) {
- logger.error("error {}", e.getMessage());
- }
- }
- }
代码解释:WebSocketStompClient的connect失败后会被这个方法捕获并处理,此处捕获ConnectionLostException错误,则每隔5秒重新建立连接。
创建connect即new connect的代码区域为创建client连接的地方,需要根据代码情况自己修改。
运行之后服务端断开,client端会每隔5s发起一次连接,连接失败则报错。如果服务端启动后,client端则会正常连接成功。
以上这种方法,并不是一种很好的方法,
更好的是
ListenableFuture<StompSession> future = stompClient.connect(url, logHandler); try { session = future.get(); session.setAutoReceipt(true); } catch (Exception e) { e.printStackTrace(); }
每隔2秒钟,boolean connected = session.isConnected();
如果为false就,重新调用一次connect