package com.nq.ws; import com.nq.enums.EStockType; import com.nq.utils.PropertiesUtil; import lombok.extern.slf4j.Slf4j; import org.java_websocket.client.WebSocketClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.net.URI; import java.util.HashMap; import java.util.Map; @Slf4j @Configuration public class WebSocketClientBeanConfig { @Bean public Map websocketRunClientMap() { Map retMap = new HashMap<>(2); try { WebsocketRunClient hkWebsocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("HK_WS_URL")), EStockType.HK); hkWebsocketRunClient.connect(); hkWebsocketRunClient.setConnectionLostTimeout(0); startHeartbeatThread(hkWebsocketRunClient); retMap.put(EStockType.HK.getStockKey(), hkWebsocketRunClient); } catch (Exception e) { log.error("hkWebsocketRunClient 异常: {}", e.getMessage()); } try { TWWebsocketRunClient twWebsocketRunClient = new TWWebsocketRunClient(new URI(PropertiesUtil.getProperty("TW_WS_URL")), EStockType.TW); twWebsocketRunClient.connect(); twWebsocketRunClient.setConnectionLostTimeout(0); startHeartbeatThread(twWebsocketRunClient); retMap.put(EStockType.TW.getStockKey(), twWebsocketRunClient); } catch (Exception e) { log.error("twWebsocketRunClient 异常: {}", e.getMessage()); } return retMap; } private void startHeartbeatThread(WebSocketClient client) { new Thread(() -> { while (true) { try { Thread.sleep(8000); if (client.isOpen()) { // 先检查连接状态 client.send("heartbeat".getBytes()); } else { client.reconnect(); client.setConnectionLostTimeout(0); } } catch (Exception e) { log.error("心跳线程异常, 尝试重连: {}", e.getMessage()); try { client.reconnect(); client.setConnectionLostTimeout(0); } catch (Exception re) { log.error("重连失败: {}", re.getMessage()); } } } }).start(); } }