xiaoyi
5 天以前 05ab6e3f69a5e73624b2573db043f5923e8f7d8b
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/collect/mqtt/MesCollectMqttClient.java
@@ -12,6 +12,9 @@
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -114,15 +117,34 @@
    private void subscribe() {
        MesCollectProperties.Mqtt mqtt = properties.getMqtt();
        String topic = normalizeTopicPrefix(mqtt.getTopicPrefix()) + "+/+";
        try {
            client.subscribe(topic, mqtt.getQos());
            log.info("[subscribe][数采 MQTT 订阅成功:{}]", topic);
        } catch (Exception e) {
            log.error("[subscribe][数采 MQTT 订阅失败:{}]", topic, e);
        for (String topic : resolveSubscribeTopics(mqtt)) {
            try {
                client.subscribe(topic, mqtt.getQos());
                log.info("[subscribe][数采 MQTT 订阅成功:{}]", topic);
            } catch (Exception e) {
                log.error("[subscribe][数采 MQTT 订阅失败:{}]", topic, e);
            }
        }
    }
    /**
     * 解析需要订阅的主题。
     *
     * <p>显式配置 topics 优先;网关格式订阅整个前缀(gateway/#),
     * 因为网关除 attributes 外还会发 connect / disconnect,后续也可能新增主题;
     * 其余格式沿用 /YLCY/IMM/+/+ 两级通配。</p>
     */
    private List<String> resolveSubscribeTopics(MesCollectProperties.Mqtt mqtt) {
        if (StrUtil.isNotBlank(mqtt.getTopics())) {
            return Arrays.stream(mqtt.getTopics().split(","))
                    .map(String::trim)
                    .filter(StrUtil::isNotBlank)
                    .toList();
        }
        String prefix = normalizeTopicPrefix(mqtt.getTopicPrefix());
        return Collections.singletonList(mqtt.isGatewayFormat() ? prefix + "#" : prefix + "+/+");
    }
    private String normalizeTopicPrefix(String prefix) {
        if (StrUtil.isBlank(prefix)) {
            return "";