gongchunyi
2 天以前 0481b3942353f83c8506d77a0fc1a447a6942763
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -1,9 +1,9 @@
package com.ruoyi.device.service.impl;
import com.ruoyi.device.pojo.MaintenanceTask;
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;
@@ -19,21 +19,21 @@
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class MaintenanceTaskScheduler {
    @Autowired
    private Scheduler scheduler;
    private final Scheduler scheduler;
    /**
     * 添加新任务到调度器
     */
    public void scheduleMaintenanceTask(MaintenanceTask task){
    public void scheduleMaintenanceTask(MaintenanceTask task) {
        try {
            JobDetail jobDetail = buildJobDetail(task);
            Trigger trigger = buildJobTrigger(task, jobDetail);
            scheduler.scheduleJob(jobDetail, trigger);
        }catch (SchedulerException e){
            log.error("SchedulerException scheduleMaintenanceTask ERROR",e);
        } catch (SchedulerException e) {
            log.error("SchedulerException scheduleMaintenanceTask ERROR", e);
            throw new RuntimeException(e);
        }
    }
@@ -41,34 +41,54 @@
    /**
     * 更新已有任务
     */
    public void rescheduleMaintenanceTask(MaintenanceTask task){
       try{
           TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
    public void rescheduleMaintenanceTask(MaintenanceTask task) {
        try {
            TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
            JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId());
           // 获取现有触发器并转换为 CronTrigger
           Trigger oldTrigger = scheduler.getTrigger(triggerKey);
           if (!(oldTrigger instanceof CronTrigger)) {
               throw new SchedulerException("Existing trigger is not a CronTrigger");
           }
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
           // 3. 构建CronTrigger,确保持久化配置
           CronTrigger newTrigger = TriggerBuilder.newTrigger()
                   .withIdentity(triggerKey)                // 唯一标识,用于持久化存储
                   .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述
                   .forJob(oldTrigger.getJobKey())                       // 关联对应的Job
                   .withSchedule(CronScheduleBuilder
                           .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整)
                   )
                   // 4. 设置开始时间(若为null则立即生效)
                   .startAt(task.getNextExecutionTime() != null
                           ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                           : new Date())
                   .build();
           scheduler.rescheduleJob(triggerKey, newTrigger);
       }catch (SchedulerException e){
           log.error("SchedulerException rescheduleMaintenanceTask ERROR",e);
           throw new RuntimeException(e);
       }
            if (oldTrigger == null) {
                if (!scheduler.checkExists(jobKey)) {
                    JobDetail jobDetail = buildJobDetail(task);
                    Trigger newTrigger = buildJobTrigger(task, jobDetail);
                    scheduler.scheduleJob(jobDetail, newTrigger);
                } else {
                    Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey));
                    scheduler.scheduleJob(newTrigger);
                }
                return;
            }
            if (!(oldTrigger instanceof CronTrigger)) {
                scheduler.unscheduleJob(triggerKey);
                if (!scheduler.checkExists(jobKey)) {
                    JobDetail jobDetail = buildJobDetail(task);
                    Trigger newTrigger = buildJobTrigger(task, jobDetail);
                    scheduler.scheduleJob(jobDetail, newTrigger);
                } else {
                    Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey));
                    scheduler.scheduleJob(newTrigger);
                }
                return;
            }
            CronTrigger newTrigger = TriggerBuilder.newTrigger()
                    .withIdentity(triggerKey)                // 唯一标识,用于持久化存储
                    .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述
                    .forJob(oldTrigger.getJobKey())                       // 关联对应的Job
                    .withSchedule(CronScheduleBuilder
                            .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整)
                    )
                    .startAt(task.getNextExecutionTime() != null
                            ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                            : new Date())
                    .build();
            scheduler.rescheduleJob(triggerKey, newTrigger);
        } catch (SchedulerException e) {
            log.error("SchedulerException rescheduleMaintenanceTask ERROR", e);
            throw new RuntimeException(e);
        }
    }
    /**
@@ -90,12 +110,12 @@
    /**
     * 删除任务
     */
    public void unscheduleMaintenanceTask(Long taskId){
    public void unscheduleMaintenanceTask(Long taskId) {
        try {
            JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
            scheduler.deleteJob(jobKey);
        }catch (SchedulerException e){
            log.error("SchedulerException unscheduleMaintenanceTask ERROR",e);
        } catch (SchedulerException e) {
            log.error("SchedulerException unscheduleMaintenanceTask ERROR", e);
            throw new RuntimeException(e);
        }
    }
@@ -143,6 +163,7 @@
                        : new Date())
                .build();
    }
    private String convertToCronExpression(MaintenanceTask task) {
        // 参数校验
        if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
@@ -264,15 +285,23 @@
    // 转换单个星期几名称
    private String convertSingleDayName(String dayName) {
        switch (dayName.toUpperCase()) {
            case "MON": return "MON";
            case "TUE": return "TUE";
            case "WED": return "WED";
            case "THU": return "THU";
            case "FRI": return "FRI";
            case "SAT": return "SAT";
            case "SUN": return "SUN";
            default: throw new IllegalArgumentException("无效的星期几: " + dayName);
            case "MON":
                return "MON";
            case "TUE":
                return "TUE";
            case "WED":
                return "WED";
            case "THU":
                return "THU";
            case "FRI":
                return "FRI";
            case "SAT":
                return "SAT";
            case "SUN":
                return "SUN";
            default:
                throw new IllegalArgumentException("无效的星期几: " + dayName);
        }
    }
}