From b8640dc78123f4be2483feed2f48b9183983f51f Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 13 四月 2026 14:11:54 +0800
Subject: [PATCH] #站点运行优化
---
src/main/java/com/zy/core/network/ZyStationConnectDriver.java | 45 +++++++++++++++++++++++++++++++++------------
1 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
index e2fac59..c6c86f2 100644
--- a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
@@ -20,6 +20,7 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
+import java.util.UUID;
/**
* 杈撻�佺珯杩炴帴椹卞姩
@@ -29,8 +30,10 @@
private static final ZyStationFakeSegConnect zyStationFakeSegConnect = new ZyStationFakeSegConnect();
private static final ZyStationV4FakeSegConnect zyStationV4FakeSegConnect = new ZyStationV4FakeSegConnect();
- private static final long SEND_LOCK_WARN_MS = 3_000L;
+ private static final long SEND_LOCK_WARN_MS = 500L;
private static final long SEND_COST_WARN_MS = 5_000L;
+ private static final long SEND_LOCK_POLL_MS = 20L;
+ private static final long SEND_LOCK_EXPIRE_SECONDS = 15L;
private volatile boolean connected = false;
private volatile boolean connecting = false;
@@ -162,37 +165,39 @@
if (!connected || connecting || connectApi == null) {
return new CommandResponse(false, "璁惧鏈繛鎺ワ紝鍛戒护涓嬪彂澶辫触");
}
+ String lockKey = buildStationExecuteLockKey();
+ String lockToken = UUID.randomUUID().toString();
long lockWaitStart = System.currentTimeMillis();
int waitRounds = 0;
- while (true) {
- Object lock = redisUtil.get(RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key);
- if(lock != null) {
+ if (redisUtil != null) {
+ while (true) {
+ if (redisUtil.trySetStringIfAbsent(lockKey, lockToken, SEND_LOCK_EXPIRE_SECONDS)) {
+ break;
+ }
waitRounds++;
try {
- Thread.sleep(500);
- }catch (Exception e) {
+ Thread.sleep(SEND_LOCK_POLL_MS);
+ } catch (Exception e) {
e.printStackTrace();
}
- }else {
- redisUtil.set(RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key, "lock", 60 * 5);
- break;
}
}
long lockWaitCost = System.currentTimeMillis() - lockWaitStart;
if (lockWaitCost >= SEND_LOCK_WARN_MS) {
- log.warn("杈撻�佸懡浠ょ瓑寰呭叏灞�鍙戦�侀攣瓒呮椂锛宒eviceNo={}, taskNo={}, stationId={}, targetStaNo={}, waitMs={}, waitRounds={}",
+ log.warn("杈撻�佸懡浠ょ瓑寰呰澶囧彂閫侀攣瓒呮椂锛宒eviceNo={}, taskNo={}, stationId={}, targetStaNo={}, waitMs={}, waitRounds={}, lockKey={}",
deviceConfig == null ? null : deviceConfig.getDeviceNo(),
command == null ? null : command.getTaskNo(),
command == null ? null : command.getStationId(),
command == null ? null : command.getTargetStaNo(),
lockWaitCost,
- waitRounds);
+ waitRounds,
+ lockKey);
}
long sendStart = System.currentTimeMillis();
try {
return connectApi.sendCommand(deviceConfig.getDeviceNo(), command);
} finally {
- redisUtil.del(RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key);
+ releaseDeviceSendLock(lockKey, lockToken);
long sendCostMs = System.currentTimeMillis() - sendStart;
if (sendCostMs >= SEND_COST_WARN_MS) {
log.warn("杈撻�佸懡浠ゅ簳灞傚彂閫佽�楁椂杩囬暱锛宒eviceNo={}, taskNo={}, stationId={}, targetStaNo={}, sendCostMs={}",
@@ -205,6 +210,22 @@
}
}
+ private String buildStationExecuteLockKey() {
+ Integer deviceNo = deviceConfig == null ? null : deviceConfig.getDeviceNo();
+ return RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key + ":" + deviceNo;
+ }
+
+ private void releaseDeviceSendLock(String lockKey, String lockToken) {
+ if (redisUtil == null || lockKey == null) {
+ return;
+ }
+ try {
+ redisUtil.compareAndDelete(lockKey, lockToken);
+ } catch (Exception e) {
+ log.warn("閲婃斁杈撻�佽澶囧彂閫侀攣澶辫触锛宭ockKey={}", lockKey, e);
+ }
+ }
+
public CommandResponse sendOriginCommand(String address, short[] data) {
ZyStationConnectApi connectApi = zyStationConnectApi;
if (!connected || connecting || connectApi == null) {
--
Gitblit v1.9.1