From 5425aba16222605c7e55adf0f05bed0aefd91299 Mon Sep 17 00:00:00 2001 From: tianyongbao Date: Mon, 29 Jun 2026 23:35:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=9B=90=E5=BA=A6=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E8=AE=BE=E5=A4=87=E4=B8=8A=E7=BA=BF=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=BB=B6=E6=97=B61.5=E7=A7=92=E5=90=8E=E5=86=8D=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../intc/iot/handler/DeviceDataHandler.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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);