From 0a4d548b6bf9cfef252400fb6d6612e45cf5b602 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 27 十月 2026 13:21:23 +0800
Subject: [PATCH] fix(scheduler): 修复定时任务调度问题并增强系统稳定性

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java |   41 +++++++++++++++++++++++++++++++++--------
 1 files changed, 33 insertions(+), 8 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 2ff2e7e..3614a39 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -1,8 +1,9 @@
 package com.ruoyi.inspectiontask.service.impl;
 
 import com.ruoyi.inspectiontask.pojo.TimingTask;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalTime;
@@ -13,10 +14,11 @@
 import java.util.stream.Collectors;
 
 @Service
+@Slf4j
+@RequiredArgsConstructor
 public class TimingTaskScheduler {
 
-    @Autowired
-    private Scheduler scheduler;
+    private final Scheduler scheduler;
 
     /**
      * 娣诲姞鏂颁换鍔″埌璋冨害鍣�
@@ -36,7 +38,13 @@
         // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
         Trigger oldTrigger = scheduler.getTrigger(triggerKey);
         if (!(oldTrigger instanceof CronTrigger)) {
-            throw new SchedulerException("Existing trigger is not a CronTrigger");
+            // 瑙﹀彂鍣ㄤ笉瀛樺湪锛堥娆¢儴缃插悗浠庢湭娉ㄥ唽锛屾垨璋冨害璁板綍琚竻鐞嗭級锛屾敼涓洪噸鏂板垱寤�
+            JobKey jobKey = new JobKey("timingTask_" + task.getId());
+            if (scheduler.checkExists(jobKey)) {
+                scheduler.deleteJob(jobKey);
+            }
+            scheduleTimingTask(task);
+            return;
         }
 
         // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
@@ -45,7 +53,8 @@
                 .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
                 .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
                 .withSchedule(CronScheduleBuilder
-                        .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                        .cronSchedule(convertToCronExpression(task))
+                        .withMisfireHandlingInstructionDoNothing()
                 )
                 // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
                 .startAt(task.getNextExecutionTime() != null
@@ -63,6 +72,18 @@
 //                .build();
 
         scheduler.rescheduleJob(triggerKey, newTrigger);
+    }
+
+    /**
+     * 纭繚浠诲姟宸插湪璋冨害鍣ㄤ腑锛屾湭娉ㄥ唽鏃惰ˉ娉ㄥ唽锛堝簲鐢ㄥ惎鍔ㄦ椂鎭㈠浣跨敤锛�
+     */
+    public void ensureScheduled(TimingTask task) throws SchedulerException {
+        JobKey jobKey = new JobKey("timingTask_" + task.getId());
+        if (scheduler.checkExists(jobKey)) {
+            return;
+        }
+        scheduleTimingTask(task);
+        log.info("琛ユ敞鍐屽贰妫�瀹氭椂浠诲姟: id={}, name={}", task.getId(), task.getTaskName());
     }
 
     /**
@@ -84,9 +105,13 @@
     /**
      * 鍒犻櫎浠诲姟
      */
-    public void unscheduleTimingTask(Long taskId) throws SchedulerException {
-        JobKey jobKey = new JobKey("timingTask_" + taskId);
-        scheduler.deleteJob(jobKey);
+    public void unscheduleTimingTask(Long taskId){
+        try {
+            JobKey jobKey = new JobKey("timingTask_" + taskId);
+            scheduler.deleteJob(jobKey);
+        }catch (SchedulerException e){
+            throw new RuntimeException(e);
+        }
     }
 
     private JobDetail buildJobDetail(TimingTask task) {

--
Gitblit v1.9.3