From 26784989e73fc36c6315e54939d1b13a50eb5020 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 26 三月 2026 21:03:00 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/move/StationMoveCoordinator.java | 29 +++++++++++++++++++++++++++++
1 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/zy/core/move/StationMoveCoordinator.java b/src/main/java/com/zy/core/move/StationMoveCoordinator.java
index 1adc417..2e6c0c3 100644
--- a/src/main/java/com/zy/core/move/StationMoveCoordinator.java
+++ b/src/main/java/com/zy/core/move/StationMoveCoordinator.java
@@ -12,15 +12,19 @@
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.function.Supplier;
@Component
public class StationMoveCoordinator {
private static final int SESSION_EXPIRE_SECONDS = 60 * 60 * 24;
+ private final Map<Integer, ReentrantLock> taskDispatchLocks = new ConcurrentHashMap<>();
@Autowired
private StationMoveSessionRegistry sessionRegistry;
@@ -36,6 +40,10 @@
public boolean isActiveRoute(Integer taskNo, Integer routeVersion) {
return sessionRegistry != null && sessionRegistry.isActiveRoute(taskNo, routeVersion);
+ }
+
+ public boolean canDispatchRoute(Integer taskNo, Integer routeVersion) {
+ return sessionRegistry != null && sessionRegistry.canDispatchRoute(taskNo, routeVersion);
}
public void markSegmentIssued(Integer taskNo, Integer routeVersion) {
@@ -76,6 +84,23 @@
saveSession(session);
}
+ public <T> T withTaskDispatchLock(Integer taskNo, Supplier<T> supplier) {
+ if (supplier == null) {
+ return null;
+ }
+ if (taskNo == null || taskNo <= 0) {
+ return supplier.get();
+ }
+ // 鍚屼竴浠诲姟鐨勫垏璺拰鍒嗘鍙戦�佸繀椤诲叡浜竴鎶婇攣锛岄伩鍏嶆棫 routeVersion 鍦ㄧ嚎绋嬫櫄鍒版椂缁х画鎶婁笂涓�鏉℃鍛戒护鍐欏嚭鍘汇��
+ ReentrantLock lock = taskDispatchLocks.computeIfAbsent(taskNo, key -> new ReentrantLock());
+ lock.lock();
+ try {
+ return supplier.get();
+ } finally {
+ lock.unlock();
+ }
+ }
+
public boolean shouldSuppressDispatch(Integer taskNo, Integer currentStationId, StationCommand candidateCommand) {
if (taskNo == null || taskNo <= 0 || currentStationId == null || candidateCommand == null) {
return false;
@@ -87,14 +112,17 @@
}
String candidateSignature = buildPathSignature(candidateCommand);
+ // 鍚� task銆佸悓褰撳墠浣嶇疆銆佸悓璺緞绛惧悕鐨勫懡浠よ涓洪噸澶嶆淳鍙戯紝鐩存帴鍘嬪埗銆�
if (!isBlank(candidateSignature) && Objects.equals(candidateSignature, session.getPathSignature())) {
return true;
}
+ // 鍒拌揪涓嬩竴鍐崇瓥绔欏悗鍏佽閲嶆柊鍐崇瓥锛屼笉缁х画鍙楁棫 session 鐨勪腑闂磋矾寰勪繚鎶ゃ��
if (Objects.equals(currentStationId, session.getNextDecisionStationId())) {
return false;
}
+ // 杩樺鍦ㄦ棫璺嚎瑕嗙洊鑼冨洿鍐呮椂锛屽叾浠栬Е鍙戞簮涓嶅簲鍐嶆彃鍏ヤ竴鏉℃柊鍛戒护銆�
return session.containsStation(currentStationId);
}
@@ -117,6 +145,7 @@
&& Objects.equals(current.getNextDecisionStationId(), command.getTargetStaNo())
&& Objects.equals(current.getPathSignature(), pathSignature);
+ // 鍚屼竴瑙﹀彂绔欍�佸悓涓�鐩爣銆佸悓涓�璺緞绛惧悕鏃跺鐢ㄥ綋鍓� session锛屽彧鍒锋柊涓嬪彂鏃堕棿锛屼笉鏂板紑 routeVersion銆�
StationMoveSession session = reuseCurrent ? current : new StationMoveSession();
if (!reuseCurrent) {
session.setRouteVersion(current == null || current.getRouteVersion() == null
--
Gitblit v1.9.1