maven
4 天以前 8504878c6fd0f8639a38ef72d8b750fd6f5ebf70
yys  定时任务持久化
已修改3个文件
35 ■■■■ 文件已修改
src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java
@@ -1,7 +1,6 @@
package com.ruoyi.inspectiontask.service.impl;
import org.quartz.JobDataMap;
import org.quartz.Scheduler;
import org.quartz.*;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
@@ -24,25 +23,6 @@
    // 假设已配置名为dataSource的数据源Bean
    @Autowired
    private DataSource dataSource;
    @Bean
    public JobDetailFactoryBean jobDetail() {
        JobDetailFactoryBean factory = new JobDetailFactoryBean();
        factory.setJobClass(TimingTaskJob.class); // 你的自定义 Job 类(需实现 Job 接口)
        // 1. 核心:设置为持久化任务(必须,否则不写入 qrtz_job_details 或重启清理)
        factory.setDurability(true);
        // 2. 可选:任务执行崩溃后,重启时是否恢复执行(建议开启)
        factory.setRequestsRecovery(true);
//        // 3. 可选:设置 JobDataMap(若需传递参数,参数需可序列化)
//        JobDataMap jobDataMap = new JobDataMap();
//        jobDataMap.put("key", "value"); // 示例参数(若参数是自定义对象,需实现 Serializable)
//        factory.setJobDataMap(jobDataMap);
        return factory;
    }
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -31,7 +31,7 @@
     * 更新已有任务
     */
    public void rescheduleTimingTask(TimingTask task) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId(), "TIMING_TASK_TRIGGER_GROUP");
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
        // 获取现有触发器并转换为 CronTrigger
        Trigger oldTrigger = scheduler.getTrigger(triggerKey);
@@ -91,7 +91,7 @@
    private JobDetail buildJobDetail(TimingTask task) {
        // 1. 构建唯一JobKey(基于任务ID,确保重启后能识别)
        JobKey jobKey = new JobKey("timingTask_" + task.getId(), "TIMING_TASK_GROUP");
        JobKey jobKey = new JobKey("timingTask_" + task.getId());
        // 2. 封装任务数据(仅使用基本类型,确保可序列化)
        JobDataMap jobDataMap = new JobDataMap();
@@ -105,20 +105,20 @@
                .withIdentity(jobKey)                    // 唯一标识,用于持久化存储
                .withDescription(task.getTaskName())     // 任务描述,存入数据库
                .usingJobData(jobDataMap)                // 绑定任务数据
                .storeDurably()                          // 即使没有触发器关联也持久化保存
                .storeDurably(true)                          // 即使没有触发器关联也持久化保存
                .requestRecovery(true)                   // 当调度器崩溃后恢复时,重新执行未完成的任务
                .build();
    }
    private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) {
        // 1. 构建唯一TriggerKey(基于任务ID)
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId(), "TIMING_TASK_TRIGGER_GROUP");
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
        // 2. 生成Cron表达式(原逻辑不变)
        String cronExpression = convertToCronExpression(task);
        // 3. 构建CronTrigger,确保持久化配置
        CronTrigger trigger = TriggerBuilder.newTrigger()
        return TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)                // 唯一标识,用于持久化存储
                .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述
                .forJob(jobDetail)                       // 关联对应的Job
@@ -131,7 +131,6 @@
                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                        : new Date())
                .build();
        return trigger;
    }
    private String convertToCronExpression(TimingTask task) {
        // 参数校验
src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
@@ -37,7 +37,7 @@
    @PostConstruct
    public void init() throws SchedulerException, TaskException
    {
        scheduler.clear();
//        scheduler.clear();
        List<SysJob> jobList = jobMapper.selectJobAll();
        for (SysJob job : jobList)
        {