From 03c3ae747f82ad22c761c79e7b1c0e0031c57d41 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 06 四月 2026 20:28:35 +0800
Subject: [PATCH] #出库站点命令下发

---
 src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java |   38 ++++++++++++++++++++++++++++++++++++--
 1 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java b/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
index 3762364..3e83c85 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
@@ -42,7 +42,8 @@
 @Slf4j
 public class ZyStationV5Thread implements Runnable, com.zy.core.thread.StationThread {
 
-    private static final int SEGMENT_EXECUTOR_POOL_SIZE = 64;
+    private static final int DEFAULT_SEGMENT_EXECUTOR_POOL_SIZE = 128;
+    private static final String CFG_SEGMENT_EXECUTOR_POOL_SIZE = "stationV5SegmentExecutorPoolSize";
     private static final int EXECUTOR_QUEUE_WARN_THRESHOLD = 20;
     private static final int EXECUTOR_ACTIVE_WARN_THRESHOLD = 48;
     private static final long SEGMENT_EXECUTE_WARN_MS = 10_000L;
@@ -50,7 +51,7 @@
     private DeviceConfig deviceConfig;
     private RedisUtil redisUtil;
     private ZyStationConnectDriver zyStationConnectDriver;
-    private final ExecutorService executor = Executors.newFixedThreadPool(SEGMENT_EXECUTOR_POOL_SIZE);
+    private final ExecutorService executor;
     private StationV5SegmentExecutor segmentExecutor;
     private final RecentStationArrivalTracker recentArrivalTracker;
     private final StationV5StatusReader statusReader;
@@ -59,10 +60,13 @@
     public ZyStationV5Thread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
         this.redisUtil = redisUtil;
+        int poolSize = resolveSegmentExecutorPoolSize(redisUtil);
+        this.executor = Executors.newFixedThreadPool(poolSize);
         this.recentArrivalTracker = new RecentStationArrivalTracker(redisUtil);
         this.segmentExecutor = new StationV5SegmentExecutor(deviceConfig, redisUtil, this::sendCommand);
         this.statusReader = new StationV5StatusReader(deviceConfig, redisUtil, recentArrivalTracker);
         this.runBlockReroutePlanner = new StationV5RunBlockReroutePlanner(redisUtil);
+        log.info("鍒濆鍖朧5杈撻�佺嚎绋嬫睜锛宒eviceNo={}, poolSize={}", deviceConfig == null ? null : deviceConfig.getDeviceNo(), poolSize);
     }
 
     @Override
@@ -128,6 +132,11 @@
             map.put(stationProtocol.getStationId(), stationProtocol);
         }
         return map;
+    }
+
+    @Override
+    public List<Integer> getAllTaskNoList() {
+        return statusReader.getTaskNoList();
     }
 
     private void pollAndDispatchQueuedCommand() {
@@ -426,6 +435,31 @@
                 threadPoolExecutor.getCompletedTaskCount());
     }
 
+    @SuppressWarnings("unchecked")
+    private int resolveSegmentExecutorPoolSize(RedisUtil redisUtil) {
+        if (redisUtil == null) {
+            return DEFAULT_SEGMENT_EXECUTOR_POOL_SIZE;
+        }
+        try {
+            Object systemConfigMapObj = redisUtil.get(com.zy.core.enums.RedisKeyType.SYSTEM_CONFIG_MAP.key);
+            if (!(systemConfigMapObj instanceof HashMap)) {
+                return DEFAULT_SEGMENT_EXECUTOR_POOL_SIZE;
+            }
+            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+            String poolSizeText = systemConfigMap.get(CFG_SEGMENT_EXECUTOR_POOL_SIZE);
+            if (poolSizeText == null || poolSizeText.trim().isEmpty()) {
+                return DEFAULT_SEGMENT_EXECUTOR_POOL_SIZE;
+            }
+            int configured = Integer.parseInt(poolSizeText.trim());
+            if (configured < 16) {
+                return 16;
+            }
+            return Math.min(configured, 512);
+        } catch (Exception ignore) {
+            return DEFAULT_SEGMENT_EXECUTOR_POOL_SIZE;
+        }
+    }
+
     @Override
     public CommandResponse sendOriginCommand(String address, short[] data) {
         return zyStationConnectDriver.sendOriginCommand(address, data);

--
Gitblit v1.9.1