spring-boot集成Quartz-job存储方式三json配置文件


前面第二种方法,需要将定时任务都存到数据库表里面,程序启动的时候读取表进行执行。

但是这样还是缺乏灵活性,因此这里创建第三种方法,将定时任务保存到本地json配置文件中,这样更灵活。

1、ApplicationInit类

package org.jeecg.modules.quartz.init;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.quartz.entity.SysQuartzramJob;
import org.jeecg.modules.quartz.enums.JobStatus;
import org.jeecg.modules.quartz.service.ISysQuartzramJobService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@Component
@Slf4j
public class ApplicationInit implements CommandLineRunner {

    private static final String TRIGGER_IDENTITY = "trigger";
    @Autowired
    private ISysQuartzramJobService sysQuartzramJobService;
    @Autowired
    private Scheduler scheduler;

    @Override
    public void run(String... args) throws Exception {

        log.info(String.format("程序启动,定时任务开始加载,时间:" + DateUtils.getTimestamp()));

        //从json配置文件加载定时任务列表
        loadJobFromFile();
    }

    //这是从数据库表读取定时任务的逻辑
    private void loadJobFromDB() throws Exception {
        try {

            QueryWrapper queryWrapper = new QueryWrapper();
            List list=sysQuartzramJobService.list(queryWrapper);
            for(SysQuartzramJob job : list)
            {
                schedulerJob(job);
                if (JobStatus.PAUSED.getStatus().equals(job.getTriggerState())) {
                    scheduler.pauseJob(new JobKey(job.getJobName(), job.getJobGroup()));
                }
            }

        }
        catch (Exception e)
        {
        log.error(e.getMessage(),e);
        }
    }

    //这是从json配置文件读取定时任务的逻辑
    private void loadJobFromFile() throws Exception {
     try {
            String jsonSrc="classpath:org/jeecg/modules/quartz/init/quartz.json";
            InputStream stream = getClass().getClassLoader().getResourceAsStream(jsonSrc.replace("classpath:", ""));
            String jsonStr = IOUtils.toString(stream);

             List list = JSON.parseArray(jsonStr, SysQuartzramJob.class);
             for (SysQuartzramJob job : list)
             {
                 schedulerJob(job);
                 if (JobStatus.PAUSED.getStatus().equals(job.getTriggerState())) {
                     scheduler.pauseJob(new JobKey(job.getJobName(), job.getJobGroup()));
                 }
             }

        } catch (IOException e) {
            log.error(e.getMessage(),e);
        }
    }


    public void schedulerJob(SysQuartzramJob job) throws Exception {
        //构建job信息
        Class cls = Class.forName(job.getJobClassName()) ;
        // cls.newInstance(); // 检验类是否存在
        JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(job.getJobName(),job.getJobGroup())
                .withDescription(job.getDescription()).build();

        // 触发时间点
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression().trim());
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TRIGGER_IDENTITY + job.getJobName(), job.getJobGroup())
                .startNow().withSchedule(cronScheduleBuilder).build();
        //交由Scheduler安排触发
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

2、json配置文件

[
  {
    "id": "1",
    "jobName": "RiverSiteWarnJob",
    "jobGroup": "river",
    "jobClassName": "org.jeecg.modules.quartz.job.RiverSiteWarnJob",
    "cronExpression": "6 0/10 * * * ?",
    "triggerState": "RUNNING",
    "description": "站点超标报警,10分钟执行1次"
  }
]

3、job定时任务

package org.jeecg.modules.quartz.job;

import org.jeecg.common.util.DateUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import lombok.extern.slf4j.Slf4j;

/**
 * 示例不带参定时任务
 * 
 * @Author Scott
 */
@Slf4j
public class SampleJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        log.info(String.format(" Jeecg-Boot 普通定时任务 SampleJob !  时间:" + DateUtils.getTimestamp()));
    }
}