Commit 1b980eff764c6fc7d986f67643da8b391a40deac

Authored by 徐烜
1 parent b62deb3e

1、修正排班时内部lineXLatch锁释放逻辑

src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
... ... @@ -88,43 +88,50 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
88 88 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
89 89 public SchedulePlan save(SchedulePlan schedulePlan) {
90 90 ReentrantLock lineXLatch = getLineXLatch(schedulePlan.getXl().getId());
  91 +
91 92 try {
92   - if (lineXLatch.tryLock(1, TimeUnit.SECONDS)) {
93   - // pre、如果排班的数据之前已经有了,删除之前的数据
94   - Date startPre = new Date();
95   - scheduleRuleService.deleteSchedulePlanInfo(
96   - schedulePlan.getXl().getLineCode(),
97   - schedulePlan.getScheduleFromTime(),
98   - schedulePlan.getScheduleToTime());
99   - Date endPre = new Date();
100   - logger.info("删除数据 {} ms --->", endPre.getTime() - startPre.getTime());
101   -
102   - // core、生成排班计划
103   - DroolsSchedulePlan droolsSchedulePlan = new DroolsSchedulePlan(
104   - schedulePlan,
105   - lineRepository, scheduleRule1FlatRepository,
106   - ttInfoRepository, ttInfoDetailRepository,
107   - carConfigInfoRepository, employeeConfigInfoRepository,
108   - rerunRuleRepository, businessRepository,
109   - scheduleRuleService,
110   - preKBase, coreKBase,
111   - logger
112   - );
113   - droolsSchedulePlan.generatePlan();
114   -
115   - return new SchedulePlan();
116   - } else {
117   - throw new ScheduleException("当前线路正在排班,请稍后再操作...");
118   - }
119   - } catch (Exception exp) {
120   - throw new RuntimeException(exp);
121   - } finally {
122   - try {
123   - lineXLatch.unlock();
124   - } catch (Exception exp2) {
  93 + if (lineXLatch.tryLock(10, TimeUnit.SECONDS)) {
  94 + try {
  95 + // pre、如果排班的数据之前已经有了,删除之前的数据
  96 + Date startPre = new Date();
  97 + scheduleRuleService.deleteSchedulePlanInfo(
  98 + schedulePlan.getXl().getLineCode(),
  99 + schedulePlan.getScheduleFromTime(),
  100 + schedulePlan.getScheduleToTime());
  101 + Date endPre = new Date();
  102 + logger.info("删除数据 {} ms --->", endPre.getTime() - startPre.getTime());
  103 +
  104 + // core、生成排班计划
  105 + DroolsSchedulePlan droolsSchedulePlan = new DroolsSchedulePlan(
  106 + schedulePlan,
  107 + lineRepository, scheduleRule1FlatRepository,
  108 + ttInfoRepository, ttInfoDetailRepository,
  109 + carConfigInfoRepository, employeeConfigInfoRepository,
  110 + rerunRuleRepository, businessRepository,
  111 + scheduleRuleService,
  112 + preKBase, coreKBase,
  113 + logger
  114 + );
  115 + droolsSchedulePlan.generatePlan();
  116 +
  117 + return new SchedulePlan();
  118 +
  119 + } catch (Exception exp) {
  120 + throw new RuntimeException(exp);
  121 +
  122 + } finally {
  123 + lineXLatch.unlock();
  124 + }
125 125  
  126 + } else {
  127 + throw new RuntimeException("当前线路[" + schedulePlan.getXl().getName() + "]正在排班,请稍后再操作...");
126 128 }
  129 + } catch (InterruptedException exp) {
  130 + // 如果线程在等待期间被中断
  131 + System.err.println(Thread.currentThread().getName() + " 在等待锁时被中断。");
  132 + Thread.currentThread().interrupt(); // 重新中断线程
127 133  
  134 + throw new RuntimeException(exp);
128 135 }
129 136  
130 137 }
... ...