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