已经捕获了异常,为什么运行几天后,程序还是发生了死锁呢?

运行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());
                    }
                });
            }
        }
    }
阅读 1.4k
1 个回答

这种问题至少要提供死锁的堆栈,否则无法看出来问题所在

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题