package com.xcong.excoin.modules.okxNewPrice; import com.xcong.excoin.modules.okxNewPrice.celue.CaoZuoService; import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.ExchangeInfoEnum; import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListService; import com.xcong.excoin.utils.RedisUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** * 管理多个OKX WebSocket客户端实例,每个实例对应一个账号 */ @Slf4j @Component @ConditionalOnProperty(prefix = "app", name = "quant", havingValue = "true") public class OkxWebSocketClientManager { @Autowired private CaoZuoService caoZuoService; @Autowired private RedisUtils redisUtils; @Autowired private WangGeListService wangGeListService; // 存储所有OkxQuantWebSocketClient实例,key为账号类型名称 private final Map quantClientMap = new ConcurrentHashMap<>(); // 存储OkxNewPriceWebSocketClient实例 private OkxKlineWebSocketClient klinePriceClient; /** * 初始化方法,在Spring Bean构造完成后执行 * 创建并初始化所有账号的WebSocket客户端实例 */ @PostConstruct public void init() { log.info("开始初始化OkxWebSocketClientManager"); // 初始化价格WebSocket客户端 try { klinePriceClient = new OkxKlineWebSocketClient(redisUtils, caoZuoService, this, wangGeListService); klinePriceClient.init(); log.info("已初始化OkxNewPriceWebSocketClient"); } catch (Exception e) { log.error("初始化OkxNewPriceWebSocketClient失败", e); } // 获取所有ExchangeInfoEnum枚举值 ExchangeInfoEnum[] accounts = ExchangeInfoEnum.values(); // 为每个账号创建一个WebSocket客户端实例 for (ExchangeInfoEnum account : accounts) { try { OkxQuantWebSocketClient client = new OkxQuantWebSocketClient(account, redisUtils); quantClientMap.put(account.name(), client); client.init(); log.info("已初始化账号 {} 的WebSocket客户端", account.name()); } catch (Exception e) { log.error("初始化账号 {} 的WebSocket客户端失败", account.name(), e); } } log.info("OkxWebSocketClientManager初始化完成"); } /** * 销毁方法,在Spring Bean销毁前执行 * 关闭所有WebSocket客户端连接和相关资源 */ @PreDestroy public void destroy() { log.info("开始销毁OkxWebSocketClientManager"); // 关闭价格WebSocket客户端 if (klinePriceClient != null) { try { klinePriceClient.destroy(); log.info("已销毁OkxNewPriceWebSocketClient"); } catch (Exception e) { log.error("销毁OkxNewPriceWebSocketClient失败", e); } } // 关闭所有量化交易WebSocket客户端实例 for (Map.Entry entry : quantClientMap.entrySet()) { try { OkxQuantWebSocketClient client = entry.getValue(); client.destroy(); log.info("已销毁账号 {} 的WebSocket客户端", entry.getKey()); } catch (Exception e) { log.error("销毁账号 {} 的WebSocket客户端失败", entry.getKey(), e); } } // 清空客户端映射 quantClientMap.clear(); log.info("OkxWebSocketClientManager销毁完成"); } /** * 获取指定账号的OkxQuantWebSocketClient实例 * @param accountName 账号类型名称 * @return WebSocket客户端实例 */ public OkxQuantWebSocketClient getClient(String accountName) { return quantClientMap.get(accountName); } /** * 获取所有OkxQuantWebSocketClient实例 * @return 所有客户端实例的集合 */ public Collection getAllClients() { return quantClientMap.values(); } /** * 获取OkxNewPriceWebSocketClient实例 * @return 价格WebSocket客户端实例 */ public OkxKlineWebSocketClient getKlineWebSocketClient() { return klinePriceClient; } }