From 41ba09635ca0e5d79117a4364c25b1a5e93c4f13 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 29 九月 2026 18:22:38 +0800
Subject: [PATCH] ``` refactor(scheduler): 优化定时任务调度器的重复任务处理和启动注册机制

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java |   55 ++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
index a6179f6..fdcf395 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -5,6 +5,7 @@
 import org.quartz.*;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeParseException;
@@ -24,6 +25,10 @@
     public void scheduleTimingTask(TimingTask task) throws SchedulerException {
         JobDetail jobDetail = buildJobDetail(task);
         Trigger trigger = buildJobTrigger(task, jobDetail);
+        if (scheduler.checkExists(jobDetail.getKey())) {
+            // 鎸佷箙鍖栫殑Job鍙兘杩樺湪锛堜緥濡傚巻鍙叉暟鎹洿鎺ュ啓鍏ャ�佷笂娆℃湭娓呯悊锛夛紝鍏堢Щ闄ゆ棫鐨凧ob鍙婂叾瑙﹀彂鍣�
+            scheduler.deleteJob(jobDetail.getKey());
+        }
         scheduler.scheduleJob(jobDetail, trigger);
     }
 
@@ -33,36 +38,46 @@
     public void rescheduleTimingTask(TimingTask task) throws SchedulerException {
         TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
 
-        // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
+        // 鑾峰彇鐜版湁瑙﹀彂鍣�
         Trigger oldTrigger = scheduler.getTrigger(triggerKey);
         if (!(oldTrigger instanceof CronTrigger)) {
-            throw new SchedulerException("Existing trigger is not a CronTrigger");
+            // 瑙﹀彂鍣ㄤ笉瀛樺湪鎴栫被鍨嬩笉绗︼紙濡備换鍔$敱鐩存帴鍐欏簱鍒涘缓锛夛紝閲嶆柊娉ㄥ唽鑰屼笉鏄姤閿�
+            scheduleTimingTask(task);
+            return;
         }
 
-        // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
+        // 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
         CronTrigger newTrigger = TriggerBuilder.newTrigger()
                 .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
                 .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
                 .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
                 .withSchedule(CronScheduleBuilder
-                        .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                        .cronSchedule(convertToCronExpression(task))
+                        .withMisfireHandlingInstructionDoNothing() // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
                 )
-                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
-                .startAt(task.getNextExecutionTime() != null
-                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
-                        : new Date())
+                // 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鎴栧凡杩囨湡鍒欑珛鍗崇敓鏁堬級
+                .startAt(resolveStartTime(task))
                 .build();
 
-        // 鏋勫缓鏂拌Е鍙戝櫒
-//        Trigger newTrigger = TriggerBuilder.newTrigger()
-//                .withIdentity(triggerKey)
-//                .withDescription(task.getTaskName())
-//                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
-//                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
-//                .forJob(oldTrigger.getJobKey())
-//                .build();
-
         scheduler.rescheduleJob(triggerKey, newTrigger);
+    }
+
+    /**
+     * 鍒ゆ柇浠诲姟鏄惁宸叉敞鍐屽埌璋冨害鍣�
+     */
+    public boolean isRegistered(Long taskId) throws SchedulerException {
+        return scheduler.checkExists(new TriggerKey("trigger_" + taskId));
+    }
+
+    /**
+     * 瑙﹀彂鍣ㄥ紑濮嬫椂闂达細涓虹┖鎴栧凡杩囨湡鏃朵粠褰撳墠鏃堕棿璧风畻锛岄伩鍏嶈ˉ璺戝巻鍙�
+     */
+    private Date resolveStartTime(TimingTask task) {
+        LocalDateTime nextExecutionTime = task.getNextExecutionTime();
+        if (nextExecutionTime == null || !nextExecutionTime.isAfter(LocalDateTime.now())) {
+            return new Date();
+        }
+        return Date.from(nextExecutionTime.atZone(ZoneId.systemDefault()).toInstant());
     }
 
     /**
@@ -130,10 +145,8 @@
                         .cronSchedule(cronExpression)
                         .withMisfireHandlingInstructionDoNothing() // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
                 )
-                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
-                .startAt(task.getNextExecutionTime() != null
-                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
-                        : new Date())
+                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鎴栧凡杩囨湡鍒欑珛鍗崇敓鏁堬級
+                .startAt(resolveStartTime(task))
                 .build();
     }
     private String convertToCronExpression(TimingTask task) {

--
Gitblit v1.9.3