From 5ef79791cf93200c938b09dbd2461a7775391825 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期日, 05 四月 2026 23:59:17 +0800
Subject: [PATCH] #线程日志

---
 src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java |   85 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 82 insertions(+), 3 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 23dadc4..3762364 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
@@ -36,12 +36,16 @@
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
 
 @Data
 @Slf4j
 public class ZyStationV5Thread implements Runnable, com.zy.core.thread.StationThread {
 
     private static final int SEGMENT_EXECUTOR_POOL_SIZE = 64;
+    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;
 
     private DeviceConfig deviceConfig;
     private RedisUtil redisUtil;
@@ -131,14 +135,33 @@
         if (task == null || task.getStep() == null || task.getStep() != 2) {
             return;
         }
-        submitSegmentCommand((StationCommand) task.getData());
+        StationCommand command = (StationCommand) task.getData();
+        logExecutorAbnormal("queue-poll", command);
+        submitSegmentCommand(command);
     }
 
     private void submitSegmentCommand(StationCommand command) {
         if (command == null || executor == null || segmentExecutor == null) {
             return;
         }
-        executor.submit(() -> segmentExecutor.execute(command));
+        executor.submit(() -> {
+            long start = System.currentTimeMillis();
+            try {
+                segmentExecutor.execute(command);
+            } finally {
+                long costMs = System.currentTimeMillis() - start;
+                if (costMs >= SEGMENT_EXECUTE_WARN_MS) {
+                    log.warn("V5杈撻�佸懡浠ゅ垎娈垫墽琛岃�楁椂杩囬暱锛宒eviceNo={}, taskNo={}, stationId={}, targetStaNo={}, costMs={}",
+                            deviceConfig.getDeviceNo(),
+                            command.getTaskNo(),
+                            command.getStationId(),
+                            command.getTargetStaNo(),
+                            costMs);
+                    logExecutorAbnormal("segment-finish-slow", command);
+                }
+            }
+        });
+        logExecutorAbnormal("after-submit", command);
     }
 
     @Override
@@ -265,7 +288,7 @@
 
     @Override
     public boolean clearPath(Integer taskNo) {
-        if (taskNo == null) {
+        if (taskNo == null || taskNo <= 0) {
             return false;
         }
         if (zyStationConnectDriver == null) {
@@ -303,6 +326,40 @@
             }
         }
         return found && success;
+    }
+
+    @Override
+    public boolean clearPathByStationSlot(Integer stationId, Integer slotIdx) {
+        if (stationId == null || slotIdx == null || zyStationConnectDriver == null) {
+            return false;
+        }
+        List<StationProtocol> status = getStatus();
+        if (status == null || status.isEmpty()) {
+            return false;
+        }
+
+        for (StationProtocol stationProtocol : status) {
+            if (stationProtocol == null || !Objects.equals(stationId, stationProtocol.getStationId())) {
+                continue;
+            }
+            if (!zyStationConnectDriver.clearTaskBufferSlot(stationId, slotIdx)) {
+                log.warn("杈撻�佺珯缂撳瓨鍖烘畫鐣欒矾寰勬寜绔欑偣妲戒綅娓呯悊澶辫触銆俿tationId={}, slotIdx={}", stationId, slotIdx);
+                return false;
+            }
+            List<StationTaskBufferItem> taskBufferItems = stationProtocol.getTaskBufferItems();
+            if (taskBufferItems != null) {
+                for (StationTaskBufferItem item : taskBufferItems) {
+                    if (item != null && Objects.equals(slotIdx, item.getSlotIdx())) {
+                        item.setTaskNo(0);
+                        item.setTargetStaNo(0);
+                        break;
+                    }
+                }
+            }
+            log.warn("杈撻�佺珯缂撳瓨鍖烘畫鐣欒矾寰勬寜绔欑偣妲戒綅娓呯悊鎴愬姛銆俿tationId={}, slotIdx={}", stationId, slotIdx);
+            return true;
+        }
+        return false;
     }
 
     @Override
@@ -347,6 +404,28 @@
         return commandResponse;
     }
 
+    private void logExecutorAbnormal(String scene, StationCommand command) {
+        if (!(executor instanceof ThreadPoolExecutor)) {
+            return;
+        }
+        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
+        int activeCount = threadPoolExecutor.getActiveCount();
+        int queuedCount = threadPoolExecutor.getQueue() == null ? 0 : threadPoolExecutor.getQueue().size();
+        if (activeCount < EXECUTOR_ACTIVE_WARN_THRESHOLD && queuedCount < EXECUTOR_QUEUE_WARN_THRESHOLD) {
+            return;
+        }
+        log.warn("V5杈撻�佺嚎绋嬫睜鍑虹幇鍫嗙Н锛宻cene={}, deviceNo={}, taskNo={}, stationId={}, targetStaNo={}, poolSize={}, activeCount={}, queuedCount={}, completedCount={}",
+                scene,
+                deviceConfig.getDeviceNo(),
+                command == null ? null : command.getTaskNo(),
+                command == null ? null : command.getStationId(),
+                command == null ? null : command.getTargetStaNo(),
+                threadPoolExecutor.getPoolSize(),
+                activeCount,
+                queuedCount,
+                threadPoolExecutor.getCompletedTaskCount());
+    }
+
     @Override
     public CommandResponse sendOriginCommand(String address, short[] data) {
         return zyStationConnectDriver.sendOriginCommand(address, data);

--
Gitblit v1.9.1