From 9b8ff50b66361c4b56074b7586b2d5951ecf2091 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 02 四月 2026 15:02:14 +0800
Subject: [PATCH] #优化运行速度
---
src/main/java/com/zy/core/plugin/FakeProcess.java | 278 +++++++++++++++++++++++++++++--------------------------
1 files changed, 148 insertions(+), 130 deletions(-)
diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index 4d03f09..962bacd 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -28,7 +28,8 @@
import com.zy.core.plugin.store.StoreInTaskContext;
import com.zy.core.plugin.store.StoreInTaskGenerationService;
import com.zy.core.plugin.store.StoreInTaskPolicy;
-import com.zy.core.task.MainProcessAsyncTaskScheduler;
+import com.zy.core.task.MainProcessLane;
+import com.zy.core.task.MainProcessTaskSubmitter;
import com.zy.core.thread.CrnThread;
import com.zy.core.thread.DualCrnThread;
import com.zy.core.thread.StationThread;
@@ -47,14 +48,8 @@
@Slf4j
@Component
public class FakeProcess implements MainProcessPluginApi, StoreInTaskPolicy {
- private static final String CRN_TASK_LANE = "fake-crn";
- private static final String STATION_TASK_LANE = "fake-station";
- private static final String DUAL_CRN_TASK_LANE = "fake-dual-crn";
- private static final String GENERATE_STORE_TASK_LANE_PREFIX = "fake-generate-store-";
- private static final String ASYNC_TASK_LANE_PREFIX = "fake-async-";
private static final long MAIN_DISPATCH_INTERVAL_MS = 200L;
private static final long ASYNC_DISPATCH_INTERVAL_MS = 50L;
- private static final long TASK_SLOW_LOG_THRESHOLD_MS = 1000L;
private static final Map<Integer, Long> stationStayTimeMap = new ConcurrentHashMap<>();
private static volatile String enableFake = "N";
@@ -91,34 +86,39 @@
@Autowired
private StationCommandDispatcher stationCommandDispatcher;
@Autowired
- private MainProcessAsyncTaskScheduler mainProcessAsyncTaskScheduler;
+ private MainProcessTaskSubmitter mainProcessTaskSubmitter;
@Override
public void run() {
long startTime = System.currentTimeMillis();
refreshFakeConfig();
- // 浠跨湡鐩稿叧浠诲姟鎸夊悇鑷� lane 涓茶鎻愪氦锛屼簰涓嶉樆濉�
- submitAsyncTask("checkInStationHasTask", ASYNC_DISPATCH_INTERVAL_MS, this::checkInStationHasTask);
- submitAsyncTask("generateFakeInTask", ASYNC_DISPATCH_INTERVAL_MS, this::generateFakeInTask);
- submitAsyncTask("generateFakeOutTask", ASYNC_DISPATCH_INTERVAL_MS, this::generateFakeOutTask);
- submitAsyncTask("calcAllStationStayTime", ASYNC_DISPATCH_INTERVAL_MS, this::calcAllStationStayTime);
- submitAsyncTask("checkOutStationStayTimeOut", ASYNC_DISPATCH_INTERVAL_MS, this::checkOutStationStayTimeOut);
- submitAsyncTask("checkInStationCrnTake", ASYNC_DISPATCH_INTERVAL_MS, this::checkInStationCrnTake);
- submitStationTask("checkStationRunBlock", ASYNC_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::checkStationRunBlock);
+ // 浠跨湡寮傛浠诲姟
+ submitAsyncTasks(ASYNC_DISPATCH_INTERVAL_MS);
+ // 浠跨湡杈撻�佺嚎鍫靛妫�娴�
+ stationOperateProcessUtils.submitCheckStationRunBlockTasks(MainProcessLane.FAKE_STATION_RUN_BLOCK, ASYNC_DISPATCH_INTERVAL_MS);
- // 璇锋眰鐢熸垚鍏ュ簱浠诲姟锛屾寜绔欑偣鎷嗘垚鐙珛涓茶閫氶亾锛岄伩鍏嶅崟绔欓樆濉炴暣杞壂鎻�
+ // 璇锋眰鐢熸垚鍏ュ簱浠诲姟
generateStoreWrkFile();
- // 鍫嗗灈鏈恒�佽緭閫佺嚎銆佸弻宸ヤ綅鍫嗗灈鏈轰换鍔″垎鍒繘鍏ュ悇鑷覆琛岄�氶亾閫愪釜鎵ц
- submitCrnTask("crnIoExecute", MAIN_DISPATCH_INTERVAL_MS, crnOperateUtils::crnIoExecute);
- submitCrnTask("crnIoExecuteFinish", MAIN_DISPATCH_INTERVAL_MS, this::crnIoExecuteFinish);
- submitStationTask("stationInExecute", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::stationInExecute);
- submitStationTask("crnStationOutExecute", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::crnStationOutExecute);
- submitStationTask("checkStationOutOrder", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::checkStationOutOrder);
- submitStationTask("watchCircleStation", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::watchCircleStation);
- submitDualCrnTask("dualCrnIoExecute", MAIN_DISPATCH_INTERVAL_MS, dualCrnOperateProcessUtils::dualCrnIoExecute);
- submitDualCrnTask("dualCrnIoExecuteFinish", MAIN_DISPATCH_INTERVAL_MS, dualCrnOperateProcessUtils::dualCrnIoExecuteFinish);
+ // 鎵ц鍫嗗灈鏈轰换鍔�
+ crnOperateUtils.submitCrnIoTasks(MainProcessLane.FAKE_CRN_IO, MAIN_DISPATCH_INTERVAL_MS);
+ // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
+ submitCrnIoExecuteFinishTasks(MAIN_DISPATCH_INTERVAL_MS);
+ // 鎵ц杈撻�佺珯鐐瑰叆搴撲换鍔�
+ stationOperateProcessUtils.submitStationInTasks(MainProcessLane.FAKE_STATION_IN, MAIN_DISPATCH_INTERVAL_MS);
+ // 妫�娴嬪叆搴撲换鍔℃槸鍚﹀凡缁忓埌杈剧洰鏍囩珯鍙�
+ stationOperateProcessUtils.submitInboundStationArrivalTasks(MAIN_DISPATCH_INTERVAL_MS);
+ // 杈撻�佺嚎鎵ц鍫嗗灈鏈哄嚭搴撳悗鐨勭珯鍙版祦杞�
+ stationOperateProcessUtils.submitCrnStationOutTasks(MainProcessLane.FAKE_STATION_OUT, MAIN_DISPATCH_INTERVAL_MS);
+ // 妫�娴嬪苟澶勭悊鍑哄簱鎺掑簭
+ stationOperateProcessUtils.submitCheckStationOutOrderTasks(MainProcessLane.FAKE_STATION_OUT_ORDER, MAIN_DISPATCH_INTERVAL_MS);
+ // 鐩戞帶杈撻�佺嚎缁曞湀绔欑偣
+ stationOperateProcessUtils.submitWatchCircleStationTasks(MainProcessLane.FAKE_STATION_WATCH_CIRCLE, MAIN_DISPATCH_INTERVAL_MS);
+ // 鎵ц鍙屽伐浣嶅爢鍨涙満浠诲姟
+ dualCrnOperateProcessUtils.submitDualCrnIoTasks(MainProcessLane.FAKE_DUAL_CRN_IO, MAIN_DISPATCH_INTERVAL_MS);
+ // 鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
+ dualCrnOperateProcessUtils.submitDualCrnIoExecuteFinishTasks(MainProcessLane.FAKE_DUAL_CRN_IO_FINISH, MAIN_DISPATCH_INTERVAL_MS);
News.info("[WCS Debug] 涓荤嚎绋婻un鎵ц瀹屾垚,鑰楁椂:{}ms", System.currentTimeMillis() - startTime);
}
@@ -148,20 +148,40 @@
}
}
- private void submitCrnTask(String taskName, long minIntervalMs, Runnable task) {
- submitProcessTask(CRN_TASK_LANE, taskName, minIntervalMs, task);
- }
-
- private void submitStationTask(String taskName, long minIntervalMs, Runnable task) {
- submitProcessTask(STATION_TASK_LANE, taskName, minIntervalMs, task);
- }
-
- private void submitDualCrnTask(String taskName, long minIntervalMs, Runnable task) {
- submitProcessTask(DUAL_CRN_TASK_LANE, taskName, minIntervalMs, task);
+ private void submitAsyncTasks(long minIntervalMs) {
+ submitAsyncTask("checkInStationHasTask", minIntervalMs, this::checkInStationHasTask);
+ submitAsyncTask("generateFakeInTask", minIntervalMs, this::generateFakeInTask);
+ submitAsyncTask("generateFakeOutTask", minIntervalMs, this::generateFakeOutTask);
+ submitAsyncTask("calcAllStationStayTime", minIntervalMs, this::calcAllStationStayTime);
+ submitAsyncTask("checkOutStationStayTimeOut", minIntervalMs, this::checkOutStationStayTimeOut);
+ submitAsyncTask("checkInStationCrnTake", minIntervalMs, this::checkInStationCrnTake);
}
private void submitAsyncTask(String taskName, long minIntervalMs, Runnable task) {
- submitProcessTask(ASYNC_TASK_LANE_PREFIX + taskName, taskName, minIntervalMs, task);
+ mainProcessTaskSubmitter.submitKeyedSerialTask(
+ MainProcessLane.FAKE_ASYNC,
+ taskName,
+ taskName,
+ minIntervalMs,
+ task
+ );
+ }
+
+ private void submitCrnIoExecuteFinishTasks(long minIntervalMs) {
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+ for (BasCrnp basCrnp : basCrnps) {
+ Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+ if (crnNo == null) {
+ continue;
+ }
+ mainProcessTaskSubmitter.submitKeyedSerialTask(
+ MainProcessLane.FAKE_CRN_IO_FINISH,
+ crnNo,
+ "crnIoExecuteFinish",
+ minIntervalMs,
+ () -> crnIoExecuteFinish(basCrnp)
+ );
+ }
}
private void submitGenerateStoreTasks() {
@@ -173,24 +193,16 @@
if (stationId == null) {
continue;
}
- submitGenerateStoreTask(stationId, MAIN_DISPATCH_INTERVAL_MS,
- () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel));
+ storeInTaskGenerationService.submitGenerateStoreTask(
+ this,
+ basDevp,
+ stationObjModel,
+ MainProcessLane.FAKE_GENERATE_STORE,
+ MAIN_DISPATCH_INTERVAL_MS,
+ () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel)
+ );
}
}
- }
-
- private void submitGenerateStoreTask(Integer stationId, long minIntervalMs, Runnable task) {
- submitProcessTask(GENERATE_STORE_TASK_LANE_PREFIX + stationId, "generateStoreWrkFile", minIntervalMs, task);
- }
-
- private void submitProcessTask(String laneName, String taskName, long minIntervalMs, Runnable task) {
- mainProcessAsyncTaskScheduler.submit(
- laneName,
- taskName,
- minIntervalMs,
- TASK_SLOW_LOG_THRESHOLD_MS,
- task
- );
}
// 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
@@ -633,84 +645,90 @@
public void crnIoExecuteFinish() {
List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
for (BasCrnp basCrnp : basCrnps) {
- CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
- if (crnThread == null) {
- continue;
- }
-
- CrnProtocol crnProtocol = crnThread.getStatus();
- if (crnProtocol == null) {
- continue;
- }
-
- if (crnProtocol.getMode() == CrnModeType.AUTO.id
- && crnProtocol.getTaskNo() > 0
- && crnProtocol.getStatus() == CrnStatusType.WAITING.id) {
- Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
- if (lock != null) {
- continue;
- }
-
- // 鑾峰彇寰呯‘璁ゅ伐浣滄。
- WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
- if (wrkMast == null) {
- News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
- continue;
- }
-
- Long updateWrkSts = null;
- if (wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts) {
- updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
- } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts) {
- updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
-
- // 鐢熸垚浠跨湡绔欑偣鏁版嵁
- List<StationObjModel> outStationList = basCrnp.getOutStationList$();
- if (outStationList.isEmpty()) {
- News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
- continue;
- }
-
- for (StationObjModel stationObjModel : outStationList) {
- if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
- continue;
- }
-
- StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp,
- stationObjModel.getDeviceNo());
- if (stationThread == null) {
- continue;
- }
- // 鐢熸垚浠跨湡绔欑偣鏁版嵁
- StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9998,
- wrkMast.getSourceStaNo(), 0, 0);
- stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "crn-out-complete-write-info");
- redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(stationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
- }
- } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts) {
- updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
- } else if (wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts) {
- updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
- } else {
- News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
- continue;
- }
-
- Date now = new Date();
- wrkMast.setWrkSts(updateWrkSts);
- wrkMast.setSystemMsg("");
- wrkMast.setIoTime(now);
- wrkMast.setModiTime(now);
- if (wrkMastService.updateById(wrkMast)) {
- wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
- CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
- MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
- News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
- }
-
- redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock", 10);
- }
+ crnIoExecuteFinish(basCrnp);
}
}
+ private void crnIoExecuteFinish(BasCrnp basCrnp) {
+ CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+ if (crnThread == null) {
+ return;
+ }
+
+ CrnProtocol crnProtocol = crnThread.getStatus();
+ if (crnProtocol == null) {
+ return;
+ }
+
+ if (crnProtocol.getMode() != CrnModeType.AUTO.id
+ || crnProtocol.getTaskNo() <= 0
+ || crnProtocol.getStatus() != CrnStatusType.WAITING.id) {
+ return;
+ }
+
+ Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
+ if (lock != null) {
+ return;
+ }
+
+ // 鑾峰彇寰呯‘璁ゅ伐浣滄。
+ WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
+ if (wrkMast == null) {
+ News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+ return;
+ }
+
+ Long updateWrkSts = null;
+ if (wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts) {
+ updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
+ } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts) {
+ updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
+
+ // 鐢熸垚浠跨湡绔欑偣鏁版嵁
+ List<StationObjModel> outStationList = basCrnp.getOutStationList$();
+ if (outStationList.isEmpty()) {
+ News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
+ return;
+ }
+
+ for (StationObjModel stationObjModel : outStationList) {
+ if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
+ continue;
+ }
+
+ StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp,
+ stationObjModel.getDeviceNo());
+ if (stationThread == null) {
+ continue;
+ }
+ // 鐢熸垚浠跨湡绔欑偣鏁版嵁
+ StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9998,
+ wrkMast.getSourceStaNo(), 0, 0);
+ stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "crn-out-complete-write-info");
+ redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(stationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+ }
+ } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts) {
+ updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
+ } else if (wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts) {
+ updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
+ } else {
+ News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+ return;
+ }
+
+ Date now = new Date();
+ wrkMast.setWrkSts(updateWrkSts);
+ wrkMast.setSystemMsg("");
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
+ if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
+ CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
+ MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
+ News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+ }
+
+ redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock", 10);
+ }
+
}
--
Gitblit v1.9.1