From 1e2f717393e4053a3b8de11cbf67cd98a8c77ec1 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Sat, 15 Nov 2025 15:34:32 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 ard-work/src/main/java/com/ard/work/component/websocket/handler/BaseSubscriptionManager.java |   32 ++++++++++++++++++++------------
 1 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/work/component/websocket/handler/BaseSubscriptionManager.java b/ard-work/src/main/java/com/ard/work/component/websocket/handler/BaseSubscriptionManager.java
index d9ffafd..8d0db3e 100644
--- a/ard-work/src/main/java/com/ard/work/component/websocket/handler/BaseSubscriptionManager.java
+++ b/ard-work/src/main/java/com/ard/work/component/websocket/handler/BaseSubscriptionManager.java
@@ -16,17 +16,18 @@
     // 存储订阅的用户
     protected final Map<String, Set<Long>> subscriptions = new ConcurrentHashMap<>();
     // 定时任务调度器
-    protected final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+    protected final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
     // 存储推送任务
     protected final Map<String, ScheduledFuture<?>> pushTasks = new ConcurrentHashMap<>();
 
     /**
      * 订阅指定设备的数据
      */
-    public void subscribe(String boxSn, Long userId,Integer period) {
-        subscriptions.computeIfAbsent(boxSn, k -> new HashSet<>()).add(userId);
+    public void subscribe(String boxSn, Long userId, Integer period) {
+        subscriptions.computeIfAbsent(boxSn, k -> ConcurrentHashMap.newKeySet()).add(userId);
         if (subscriptions.get(boxSn).size() == 1) {
-            startPushTask(boxSn,period);
+            log.debug("首次订阅,启动推送任务");
+            startPushTask(boxSn, period);
         }
     }
 
@@ -34,25 +35,33 @@
      * 取消订阅
      */
     public void unsubscribe(String boxSn, Long userId) {
-        Set<Long> userIds = subscriptions.get(boxSn);
-        if (userIds != null) {
+        subscriptions.compute(boxSn, (key, userIds) -> {
+            if (userIds == null) {
+                return null;
+            }
             userIds.remove(userId);
             if (userIds.isEmpty()) {
                 stopPushTask(boxSn);
+                log.debug("无人订阅设备 {},移除订阅记录", boxSn);
+                return null; // 直接返回 null 等价于 remove(key)
             }
-        }
+            return userIds;
+        });
     }
-
     /**
      * 启动推送任务
      */
-    private void startPushTask(String boxSn,Integer period) {
+    private void startPushTask(String boxSn, Integer period) {
         // 如果已经存在任务,则不再创建
         if (pushTasks.containsKey(boxSn)) {
             return;
         }
         ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(() -> {
-            sendDataToSubscribers(boxSn);
+            try {
+                sendDataToSubscribers(boxSn);
+            } catch (Exception e) {
+                log.error("Error in push task for boxSn={}", boxSn, e);
+            }
         }, 0, period, TimeUnit.SECONDS);
 
         pushTasks.put(boxSn, future);
@@ -79,7 +88,6 @@
     }
 
 
-
     /**
      * 向订阅者发送数据
      */
@@ -90,7 +98,7 @@
         if (userIds != null) {
             for (Long userId : userIds) {
                 try {
-                    log.debug("给用户{}定时推送",userId);
+                    log.debug("给用户{}定时推送", userId);
                     WebSocketUtil.sendMessage(userId, JSON.toJSONString(baseMessage));
                 } catch (Exception e) {
                     log.error("Error sending message to session {}", userId, e);

--
Gitblit v1.9.3