opt: 加锁处理定时器异步问题
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user