运行2天左右,就会发生一次死锁
线程都在外面等着,进入不了try块内部
public void sapGoodsMove(String factoryCode, List<OdsRawMission> list, String oprType) {
try {
if (lock.tryLock(120, TimeUnit.SECONDS)) { // 尝试获取锁,最多等待120秒
try {
List<OdsRawMission> orderRawMissions = new ArrayList<OdsRawMission>();
orderRawMissions = odsRawOrderTaskMapper.queryTransferList311(factoryCode,list);
log.info(factoryCode+":交接完成待过账数据:{}条",orderRawMissions.size());
if(orderRawMissions.size()>0){
sap(sapHost,factoryCode,orderRawMissions);
}
} catch (Exception e) {
log.error("原材料交接过账异常",e);
}
} else {
log.info(factoryCode+":未抢到锁:" + list);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 保持中断状态
log.error("获取锁时被中断", e);
} finally {
if (lock.isHeldByCurrentThread()) { // 确保只有持有锁时才解锁
lock.unlock();
}
}
}
这是调用处的代码1
@Scheduled(cron = "0 0/15 * * * ?")
public void executeGoodsMove() {
log.info("task-raw-jiaojie-sap");
if (!Boolean.parseBoolean(enable)) {
return;
}
if (profile.indexOf("russia") < 0) {
String[] split = factoryCodes.split(",");
for (String factoryCode : split) {
ThreadPool.executeTask(() -> {
try {
dbCommon.execute(factoryCode);
if (DictionaryConstant.PLANT_YDGC.contains(factoryCode)) {//印度工厂
postHandoverServiceIndia.sapGoodsMove(factoryCode, null,"task");
}
} catch (Exception e) {
e.printStackTrace();
log.error("原材料交接 过账异常:{}", e.getMessage());
}
});
}
}
}
这种问题至少要提供死锁的堆栈,否则无法看出来问题所在