소스 검색

启动时清理无效的设备缓存数据,避免设备无法注册

648540858 2 년 전
부모
커밋
bdc0f83e29

+ 20 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java

@@ -69,6 +69,26 @@ public class SipRunner implements CommandLineRunner {
         // 重置cseq计数
         redisCatchStorage.resetAllCSEQ();
         // 清理redis
+        // 清理数据库不存在但是redis中存在的数据
+        List<Device> devicesInDb = deviceService.getAll();
+        if (devicesInDb.size() == 0) {
+            redisCatchStorage.removeAllDevice();
+        }else {
+            List<Device> devicesInRedis = redisCatchStorage.getAllDevices();
+            if (devicesInRedis.size() > 0) {
+                Map<String, Device> deviceMapInDb = new HashMap<>();
+                devicesInDb.parallelStream().forEach(device -> {
+                    deviceMapInDb.put(device.getDeviceId(), device);
+                });
+                devicesInRedis.parallelStream().forEach(device -> {
+                    if (deviceMapInDb.get(device.getDeviceId()) == null) {
+                        redisCatchStorage.removeDevice(device.getDeviceId());
+                    }
+                });
+            }
+        }
+
+
         // 查找国标推流
         List<SendRtpItem> sendRtpItems = redisCatchStorage.queryAllSendRTPServer();
         if (sendRtpItems.size() > 0) {

+ 4 - 0
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java

@@ -163,4 +163,8 @@ public interface IDeviceService {
      */
     ResourceBaceInfo getOverview();
 
+    /**
+     * 获取所有设备
+     */
+    List<Device> getAll();
 }

+ 5 - 0
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java

@@ -631,4 +631,9 @@ public class DeviceServiceImpl implements IDeviceService {
     public ResourceBaceInfo getOverview() {
         return deviceMapper.getOverview();
     }
+
+    @Override
+    public List<Device> getAll() {
+        return deviceMapper.getAll();
+    }
 }

+ 3 - 0
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java

@@ -258,4 +258,7 @@ public interface IRedisCatchStorage {
 
     List<SendRtpItem> queryAllSendRTPServer();
 
+    List<Device> getAllDevices();
+
+    void removeAllDevice();
 }

+ 2 - 0
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java

@@ -280,4 +280,6 @@ public interface DeviceMapper {
     @Select("select count(1) as total, sum(online) as online from device")
     ResourceBaceInfo getOverview();
 
+    @Select("select * from device")
+    List<Device> getAll();
 }

+ 25 - 0
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java

@@ -664,6 +664,31 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
         RedisUtil.del(key);
     }
 
+    @Override
+    public void removeAllDevice() {
+        String scanKey = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_*";
+        List<Object> keys = RedisUtil.scan(scanKey);
+        for (Object key : keys) {
+            RedisUtil.del((String) key);
+        }
+    }
+
+    @Override
+    public List<Device> getAllDevices() {
+        String scanKey = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_*";
+        List<Device> result = new ArrayList<>();
+        List<Object> keys = RedisUtil.scan(scanKey);
+        for (Object o : keys) {
+            String key = (String) o;
+            Device device = JsonUtil.redisJsonToObject(key, Device.class);
+            if (Objects.nonNull(device)) { // 只取没有存过得
+                result.add(JsonUtil.redisJsonToObject(key, Device.class));
+            }
+        }
+
+        return result;
+    }
+
     @Override
     public Device getDevice(String deviceId) {
         String key = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_" + deviceId;