spring-boot集成Quartz-job存储方式二RAM,改从json配置文件读取job配置

前面第二种RAM方法已经可以满足单机使用需求了,但是本地调试和服务器应用会有冲突,因此将定时任务保存到本地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<SysQuartzramJob> queryWrapper = new QueryWrapper<SysQuartzramJob>();
            List<SysQuartzramJob> 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,"utf-8");
log.info("定时器:"+jsonStr); List
<SysQuartzramJob> 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、yml配置

quartz:
    properties:
      org:
        quartz:
          scheduler:
            instanceName: quartzScheduler
            instanceId: AUTO
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true

4、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()));
    }
}

 

posted @ 2022-03-02 22:55  JackGIS  阅读(121)  评论(0编辑  收藏  举报