diff --git a/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java b/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java index d853d7c..97b3590 100644 --- a/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java +++ b/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java @@ -47,6 +47,9 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * 设备数据处理器 @@ -62,6 +65,17 @@ public class DeviceDataHandler { public static final String PENDING_SOLAR_SALINITY_KEY_PREFIX = "device:pending:solar:salinity:"; private static final int DEVICE_TYPE_SOLAR_CONTROLLER = 3; + /** + * 太阳能盐度补发专用调度线程池(daemon线程,避免阻止JVM退出) + * 用于设备上线后延迟执行属性下发,确保设备已完成 MQTT 订阅 + */ + private static final ScheduledExecutorService SOLAR_SALINITY_SCHEDULER = + Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r, "solar-salinity-flush"); + t.setDaemon(true); + return t; + }); + /** * TDengine 服务,用于存储设备时序数据 */ @@ -960,7 +974,12 @@ public class DeviceDataHandler { log.info("[离线告警] 设备已上线,取消离线告警: {}", deviceName); } - flushPendingSolarSalinity(deviceName, "生命周期上线"); + // 异步延迟 1.5 秒补发缓存盐度:设备刚上线时尚未完成 MQTT 订阅, + // 立即下发属性会失败,等待 1.5 秒让设备完成订阅后再下发 + SOLAR_SALINITY_SCHEDULER.schedule( + () -> flushPendingSolarSalinity(deviceName, "生命周期上线"), + 1500L, TimeUnit.MILLISECONDS + ); // 同步更新 Device.warnCode,清除离线和休眠标志位 setDeviceWarnCodeBit(deviceName, DefineDeviceWarnCode.DeviceOffline, false);