package com.yami.trading.huobi.jsws;
|
|
|
import com.yami.trading.huobi.websocket.constant.enums.EStockType;
|
import lombok.extern.slf4j.Slf4j;
|
import org.java_websocket.client.WebSocketClient;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.stereotype.Component;
|
|
import java.net.URI;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
@Slf4j
|
@Component
|
public class WebSocketClientBeanConfig {
|
|
// 注入Spring上下文,用于获取原型Bean
|
@Autowired
|
private ApplicationContext applicationContext;
|
|
@Bean
|
public Map<String, WebSocketClient> websocketRunClientMap() {
|
|
Map<String, WebSocketClient> retMap = new HashMap<>(1);
|
try {
|
// 关键:通过Spring上下文获取WebsocketRunClient实例(而非直接new)
|
// 传入参数创建实例(需配合原型作用域)
|
WebsocketRunClient websocketRunClient = applicationContext.getBean(
|
WebsocketRunClient.class,
|
new URI(EStockType.US.getWsUrl()), // 第一个参数:serverUri
|
EStockType.US // 第二个参数:eStockType
|
);
|
websocketRunClient.connect();
|
websocketRunClient.setConnectionLostTimeout(0);
|
startHeartbeatThread(websocketRunClient);
|
retMap.put(EStockType.US.getStockKey(), websocketRunClient);
|
} catch (Exception e) {
|
log.error("WebsocketRunClient 异常: {}", 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();
|
}
|
|
|
}
|