From 9b2eedb85d53ca32610c32c6e50b5230ab3b16cf Mon Sep 17 00:00:00 2001
From: sean.zhou <sean.zhou@dji.com>
Date: Fri, 22 Jul 2022 20:16:03 +0800
Subject: [PATCH] V1.1.0 for dock

---
 src/main/java/com/dji/sample/component/GlobalScheduleService.java |   53 +++++++++++++++++++++++++++--------------------------
 1 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/dji/sample/component/GlobalScheduleService.java b/src/main/java/com/dji/sample/component/GlobalScheduleService.java
index ea44a62..2813388 100644
--- a/src/main/java/com/dji/sample/component/GlobalScheduleService.java
+++ b/src/main/java/com/dji/sample/component/GlobalScheduleService.java
@@ -1,5 +1,9 @@
 package com.dji.sample.component;
 
+import com.dji.sample.component.mqtt.service.IMqttTopicService;
+import com.dji.sample.component.redis.RedisConst;
+import com.dji.sample.component.redis.RedisOpsUtils;
+import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.enums.DeviceDomainEnum;
 import com.dji.sample.manage.service.IDeviceService;
 import lombok.extern.slf4j.Slf4j;
@@ -7,12 +11,8 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.time.LocalDateTime;
-import java.util.Map;
+import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
-
-import static com.dji.sample.manage.model.DeviceStatusManager.DEFAULT_ALIVE_SECOND;
-import static com.dji.sample.manage.model.DeviceStatusManager.STATUS_MANAGER;
 
 /**
  * @author sean.zhou
@@ -26,33 +26,34 @@
     @Autowired
     private IDeviceService deviceService;
 
+    @Autowired
+    private RedisOpsUtils redisOps;
+
+    @Autowired
+    private IMqttTopicService topicService;
+
     /**
      * Check the status of the devices every 30 seconds. It is recommended to use cache.
      */
-    @Scheduled(fixedRate = 30, timeUnit = TimeUnit.SECONDS)
+    @Scheduled(initialDelay = 30, fixedRate = 30, timeUnit = TimeUnit.SECONDS)
     private void deviceStatusListen() {
-        for (Map.Entry<String, LocalDateTime> entry : STATUS_MANAGER.entrySet()) {
-            if (entry.getValue().isAfter(
-                    LocalDateTime.now().minusSeconds(DEFAULT_ALIVE_SECOND))) {
-                continue;
+        int start = RedisConst.DEVICE_ONLINE_PREFIX.length();
+
+        redisOps.getAllKeys(RedisConst.DEVICE_ONLINE_PREFIX + "*").forEach(key -> {
+            long expire = redisOps.getExpire(key);
+            if (expire <= 30) {
+                DeviceDTO device = (DeviceDTO) redisOps.get(key);
+                if (device.getDomain().equals(DeviceDomainEnum.SUB_DEVICE.getDesc())) {
+                    deviceService.subDeviceOffline(key.substring(start));
+                } else {
+                    deviceService.unsubscribeTopicOffline(key.substring(start));
+                    deviceService.pushDeviceOfflineTopo(device.getWorkspaceId(), device.getDeviceSn());
+                }
+                redisOps.del(key);
             }
+        });
 
-            String device = entry.getKey();
-            int index = device.indexOf("/");
-
-            STATUS_MANAGER.remove(device);
-
-            int type = Integer.parseInt(device.substring(0, index));
-            String sn = device.substring(index + 1);
-            // Determine whether it is a gateway device.
-            if (DeviceDomainEnum.GATEWAY.getVal() == type) {
-                deviceService.deviceOffline(sn);
-                deviceService.unsubscribeTopicOffline(sn);
-                continue;
-            }
-
-            deviceService.subDeviceOffline(sn);
-        }
+        log.info("Subscriptions: {}", Arrays.toString(topicService.getSubscribedTopic()));
     }
 
 }
\ No newline at end of file

--
Gitblit v1.9.3