opt: 加锁处理定时器异步问题

This commit is contained in:
2025-06-16 18:53:03 +08:00
parent 34cf36c90e
commit 8dc996bf2c

View File

@@ -41,6 +41,8 @@ import org.nl.system.service.notice.ISysNoticeService;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -51,6 +53,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -106,6 +109,8 @@ public class AutoCallAirShaftTask extends Prun {
public List<String> stepErrorInfo = new ArrayList<>();
private static final DateTimeFormatter TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired
private RedissonClient redissonClient;
/**
* hint: 目前只是考虑了上区域
@@ -117,21 +122,38 @@ public class AutoCallAirShaftTask extends Prun {
* update: 24/04/28 内包间只是区分气胀轴大小(即代数),不需要区分锂电/标箔
*/
public void run() {
log.info("自动呼叫套轴开始执行...");
// 判断配置参数是否只做拔轴
Param isOnlyPulling = paramService.findByCode(IS_ONLY_PULLING);
Param tzDay = paramService.findByCode(TZ_DAY);
Param paramObj = paramService.findByCode(PARAM_CODE_PLAN_AREA);
Param useXn = paramService.findByCode(USE_XN);
// 1、获取空的插拔轴位(无任务)
List<BstIvtShafttubeivt> emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2",
"0", "0");
for (BstIvtShafttubeivt empty : emptyPoints) {
stepStr = "";
stepErrorInfo = new ArrayList<>();
doCallShaft(empty, isOnlyPulling, tzDay, paramObj, useXn);
redisUtils.set("INFO" + empty.getPoint_code(), stepStr);
redisUtils.set("ERROR" + empty.getPoint_code(), stepErrorInfo);
RLock lock = redissonClient.getLock("TestTask");
boolean tryLock = false;
try {
tryLock = lock.tryLock(0, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
if (tryLock) {
log.info("自动呼叫套轴开始执行...");
// 判断配置参数是否只做拔轴
Param isOnlyPulling = paramService.findByCode(IS_ONLY_PULLING);
Param tzDay = paramService.findByCode(TZ_DAY);
Param paramObj = paramService.findByCode(PARAM_CODE_PLAN_AREA);
Param useXn = paramService.findByCode(USE_XN);
// 1、获取空的插拔轴位(无任务)
List<BstIvtShafttubeivt> emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2",
"0", "0");
for (BstIvtShafttubeivt empty : emptyPoints) {
stepStr = "";
stepErrorInfo = new ArrayList<>();
doCallShaft(empty, isOnlyPulling, tzDay, paramObj, useXn);
redisUtils.set("INFO" + empty.getPoint_code(), stepStr);
redisUtils.set("ERROR" + empty.getPoint_code(), stepErrorInfo);
}
} else {
log.info("退出");
}
} finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}