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