From 392a6ba0f6c98b4a8b5398b4b75ad909f9bcf67c Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 24 Aug 2026 14:16:56 +0800
Subject: [PATCH] fix(gate): 修复心跳调度器中服务器端口获取问题

---
 src/main/java/com/xcong/excoin/modules/gateApi/CommandQueueInitializer.java |   70 +++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/CommandQueueInitializer.java b/src/main/java/com/xcong/excoin/modules/gateApi/CommandQueueInitializer.java
new file mode 100644
index 0000000..b310d5d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/CommandQueueInitializer.java
@@ -0,0 +1,70 @@
+package com.xcong.excoin.modules.gateApi;
+
+import com.xcong.excoin.configurations.RabbitMqConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.*;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * JAR 启动时动态创建专属命令队列 QUEUE_GATE_CMD_{apiKeyMd5}
+ */
+@Slf4j
+@Component
+@DependsOn("gateWebSocketClientManager")
+public class CommandQueueInitializer {
+
+    @Resource
+    private AmqpAdmin amqpAdmin;
+
+    @Resource
+    private GateWebSocketClientManager manager;
+
+    private volatile String queueName;
+
+    @PostConstruct
+    public void init() {
+        try {
+            // manager.config 此时已由 Manager 的 @PostConstruct 加载完成
+            String apiKey = manager.getConfig().getApiKey();
+            String apiKeyMd5 = md5(apiKey);
+            String routingKey = "cmd." + apiKeyMd5;
+            queueName = "QUEUE_GATE_CMD_" + apiKeyMd5;
+
+            DirectExchange exchange = new DirectExchange(RabbitMqConfig.EXCHANGE_GATE);
+            Queue queue = new Queue(queueName, true, false, true); // durable, non-exclusive, auto-delete
+            Binding binding = BindingBuilder.bind(queue).to(exchange).with(routingKey);
+
+            amqpAdmin.declareQueue(queue);
+            amqpAdmin.declareBinding(binding);
+
+            log.info("[Gate] 命令队列已注册, queue={}, routingKey={}", queueName, routingKey);
+        } catch (Exception e) {
+            log.error("[Gate] 命令队列注册失败, 策略启停指令将无法接收", e);
+            queueName = null;
+        }
+    }
+
+    /** 返回队列名,供 @RabbitListener 引用 */
+    public String getQueueName() {
+        return queueName;
+    }
+
+    private static String md5(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
+            StringBuilder sb = new StringBuilder();
+            for (byte b : digest) sb.append(String.format("%02x", b));
+            return sb.toString();
+        } catch (NoSuchAlgorithmException e) {
+            return Integer.toHexString(input.hashCode());
+        }
+    }
+}

--
Gitblit v1.9.1