Administrator
8 days ago 54c41b98114c82feb091b83bcaaaae839abb65db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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<String, OkxQuantWebSocketClient> 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, caoZuoService, 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<String, OkxQuantWebSocketClient> 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<OkxQuantWebSocketClient> getAllClients() {
        return quantClientMap.values();
    }
    
    /**
     * 获取OkxNewPriceWebSocketClient实例
     * @return 价格WebSocket客户端实例
     */
    public OkxKlineWebSocketClient getKlineWebSocketClient() {
        return klinePriceClient;
    }
}