From af3b68eeca07a30967754dc1a61b8def9efe188c Mon Sep 17 00:00:00 2001
From: aijinhui <aijinhui>
Date: Thu, 14 Dec 2023 11:59:59 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ard-work/src/main/java/com/ruoyi/alarm/config/AsyncConfiguration.java            |   21 ++++++++++
 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java |   33 ++++++++++------
 ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java     |    4 +-
 ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java            |    2 
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java      |   29 ++++++++++----
 5 files changed, 64 insertions(+), 25 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/alarm/config/AsyncConfiguration.java b/ard-work/src/main/java/com/ruoyi/alarm/config/AsyncConfiguration.java
index 55e35ff..9512bbb 100644
--- a/ard-work/src/main/java/com/ruoyi/alarm/config/AsyncConfiguration.java
+++ b/ard-work/src/main/java/com/ruoyi/alarm/config/AsyncConfiguration.java
@@ -71,4 +71,25 @@
         executor.initialize();
         return executor;
     }
+    @Bean("guideExecutor")
+    public Executor guideExecutor(){
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        //配置核心线程数
+        executor.setCorePoolSize(corePoolSize);
+        //配置最大线程数
+        executor.setMaxPoolSize(maxPoolSize);
+        //配置队列大小
+        executor.setQueueCapacity(queueCapacity);
+        //线程的名称前缀
+        executor.setThreadNamePrefix("guideExecutor-");
+        //线程活跃时间(秒)
+        executor.setKeepAliveSeconds(keepAliveSeconds);
+        //等待所有任务结束后再关闭线程池
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        //设置拒绝策略
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        //执行初始化
+        executor.initialize();
+        return executor;
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java
index b883dc7..7797e6e 100644
--- a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java
+++ b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java
@@ -71,9 +71,9 @@
         //    newThread.start();
         //}
     }
-    @Async
+    @Async("guideExecutor")
     public void process(String cameraId) {
-        log.debug("CameraId:【" + cameraId + "】队列处理器启动");
+        log.debug("CameraId:【" + cameraId + "】引导队列处理器启动成功");
         PriorityBlockingQueue<GuideTask> guideTasks = GuidePriorityQueue.cameraQueueMap.get(cameraId);
         while (true) {
             if (guideTasks.size() > 0) {
diff --git a/ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java b/ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java
index c5961d1..e811055 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java
@@ -113,7 +113,7 @@
                 if (client.isConnected()) {
                     client.subscribe(topic, qos);
                     log.info("mqtt连接成功" );
-                    log.info("--订阅主题::" + Arrays.toString(topic));
+                    log.info("订阅主题:" + Arrays.toString(topic));
                 } else {
                     log.info("mqtt连接失败");
                 }
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
index 306fb1c..2eb90d2 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -217,7 +217,14 @@
             ardChannelService.insertArdChannel(channel);
         }
         //配置到流媒体
-        for (int i = 1; i < m_stDeviceInfo.byChanNum + 1; i++) {
+        addVtdu(camera);
+        //创建引导队列
+        createGuideQueue(camera);
+    }
+
+    //添加到流媒体
+    private void addVtdu(ArdCameras camera) {
+        for (int i = 1; i < camera.getChanNum() + 1; i++) {
             String name = camera.getId() + "_" + i;
             String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + i + "&subtype=0";
             Vtdu vtdu = vtduService.selectVtduByName(name);
@@ -243,16 +250,20 @@
             vtdu.setCameraId(camera.getId());
             vtduService.insertVtdu(vtdu);
         }
+    }
 
-        //创建引导队列
-        if (camera.getCamAlarmGuideEnable() == 1) {
-            if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
-                Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
-                PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
-                GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
+    //创建引导队列
+    private void createGuideQueue(ArdCameras camera) {
+        if (camera.getCamAlarmGuideEnable() != null) {
+            if (camera.getCamAlarmGuideEnable() == 1) {
+                if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
+                    Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
+                    PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
+                    GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
+                    //启动队列处理器
+                    queueHandler.process(camera.getId());
+                }
             }
-            //启动队列处理器
-            queueHandler.process(camera.getId());
         }
     }
 
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
index d822c17..8bf60c2 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -57,6 +57,7 @@
     @Resource
     private QueueHandler queueHandler;
 
+    public Object _lock=new Object();
     public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK;
     private static HCNetSDK.FExceptionCallBack fExceptionCallBack;//异常回调
 
@@ -180,7 +181,6 @@
     @Async("loginExecutor")
     public void asyncLogin(ArdCameras camera) {
         try {
-            Thread.sleep(100);
             // 初始化
             if (!hCNetSDK.NET_DVR_Init()) {
                 log.error("SDK初始化失败");
@@ -230,17 +230,18 @@
             }
 
             log.debug("Login Success 【 " + camera.getIp() + ":" + camera.getPort() + " 】");
-            if (fExceptionCallBack == null) {
-                fExceptionCallBack = new ExceptionCallBack();//异常回调
-                //设置异常回调函数(可在回调函数中获取设备上下线状态等)
-                if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, null)) {
-                    log.debug("Set fExceptionCallBack function fail");
-                    return;
-                } else {
-                    log.debug("Set fExceptionCallBack function successfully!");
+            synchronized (_lock) {
+                if (fExceptionCallBack == null) {
+                    fExceptionCallBack = new ExceptionCallBack();//异常回调
+                    //设置异常回调函数(可在回调函数中获取设备上下线状态等)
+                    if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, null)) {
+                        log.debug("Set fExceptionCallBack function fail");
+                        return;
+                    } else {
+                        log.debug("Set fExceptionCallBack function successfully!");
+                    }
                 }
             }
-
             if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                 GlobalVariable.loginMap.remove(camera.getId());
             }
@@ -269,6 +270,15 @@
             //添加到流媒体
             addVtdu(camera);
             //创建引导队列
+            createGuideQueue(camera);
+        } catch (Exception ex) {
+            log.error("注册设备异常", ex);
+        }
+    }
+
+    //创建引导队列
+    private void createGuideQueue(ArdCameras camera) {
+        if(camera.getCamAlarmGuideEnable()!=null) {
             if (camera.getCamAlarmGuideEnable() == 1) {
                 if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                     Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
@@ -278,11 +288,8 @@
                     queueHandler.process(camera.getId());
                 }
             }
-        } catch (Exception ex) {
-            log.error("注册设备异常", ex);
         }
     }
-
     //添加到流媒体
     private void addVtdu(ArdCameras camera) {
         try {

--
Gitblit v1.9.3