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/device/service/impl/MaintenanceTaskScheduler.java |   27 +++++++++++++++++++++++++--
 1 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
index ec7a8e3..17fb7da 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -48,7 +48,13 @@
            // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
            if (!(oldTrigger instanceof CronTrigger)) {
-               throw new SchedulerException("Existing trigger is not a CronTrigger");
+               // 瑙﹀彂鍣ㄤ笉瀛樺湪锛堥娆¢儴缃插悗浠庢湭娉ㄥ唽锛屾垨璋冨害璁板綍琚竻鐞嗭級锛屾敼涓洪噸鏂板垱寤�
+               JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId());
+               if (scheduler.checkExists(jobKey)) {
+                   scheduler.deleteJob(jobKey);
+               }
+               scheduleMaintenanceTask(task);
+               return;
            }
 
            // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
@@ -57,7 +63,8 @@
                    .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
                    .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
                    .withSchedule(CronScheduleBuilder
-                           .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                           .cronSchedule(convertToCronExpression(task))
+                           .withMisfireHandlingInstructionDoNothing()
                    )
                    // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
                    .startAt(task.getNextExecutionTime() != null
@@ -72,6 +79,22 @@
     }
 
     /**
+     * 纭繚浠诲姟宸插湪璋冨害鍣ㄤ腑锛屾湭娉ㄥ唽鏃惰ˉ娉ㄥ唽锛堝簲鐢ㄥ惎鍔ㄦ椂鎭㈠浣跨敤锛�
+     */
+    public void ensureScheduled(MaintenanceTask task){
+        try {
+            JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId());
+            if (scheduler.checkExists(jobKey)) {
+                return;
+            }
+            scheduleMaintenanceTask(task);
+            log.info("琛ユ敞鍐屼繚鍏诲畾鏃朵换鍔�: id={}, name={}", task.getId(), task.getTaskName());
+        } catch (SchedulerException e) {
+            log.error("SchedulerException ensureScheduled ERROR", e);
+        }
+    }
+
+    /**
      * 鏆傚仠浠诲姟
      */
     public void pauseMaintenanceTask(Long taskId) throws SchedulerException {

--
Gitblit v1.9.3