Sfoglia il codice sorgente

fix: 检查超时预警加上分布式锁,防止同时触发

wuwenyi 1 settimana fa
parent
commit
6aacb351ff

+ 15 - 1
src/main/java/com/qqflow/engine/domain/flow/job/OverdueCheckJob.java

@@ -1,6 +1,7 @@
 package com.qqflow.engine.domain.flow.job;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qqflow.engine.common.service.RedissonService;
 import com.qqflow.engine.domain.flow.enums.TaskStatus;
 import com.qqflow.engine.domain.flow.po.ApprovalTask;
 import com.qqflow.engine.domain.flow.service.NotificationService;
@@ -15,6 +16,7 @@ import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 审批任务超时检查定时任务
@@ -35,12 +37,24 @@ public class OverdueCheckJob {
     private final ApprovalTaskMapper approvalTaskMapper;
     private final ProcessInstanceMapper processInstanceMapper;
     private final NotificationService notificationService;
+    private final RedissonService redissonService;
+
+    private static final String LOCK_KEY = "job:overdue-check";
 
     /**
-     * 每 5 分钟执行一次
+     * 每 5 分钟执行一次,分布式锁保证多实例只有一个触发
      */
     @Scheduled(cron = "0 0/5 * * * ?")
     public void check() {
+        if (!redissonService.tryLock(LOCK_KEY, 0, 240, TimeUnit.SECONDS)) return;
+        try {
+            doCheck();
+        } finally {
+            redissonService.unlock(LOCK_KEY);
+        }
+    }
+
+    private void doCheck() {
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime warningThreshold = now.plusHours(24);