Springboot集成quartz
项目中要用到定时任务,所以结合以前的项目和网上的找的东西,整合到了项目中,测试可用
首先是添加的jar包依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
使用的SpringBoot版本是2.1.3.RELEASE
然后是一些相关的配置文件
# quartz config spring.quartz.properties.org.quartz.scheduler.instanceName=clusteredScheduler spring.quartz.properties.org.quartz.scheduler.id=AUTO #spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX #spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate #spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ #spring.quartz.properties.org.quartz.jobStore.isClustered=true #spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000 #spring.quartz.properties.org.quartz.jobStore.useProperties=false spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartz.threadPool.threadCount=10 spring.quartz.properties.org.quartz.threadPool.threadPriority=5 spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true #spring.quartz.job-store-type=jdbc
因为使用的是SpringBoot的项目,去除掉了xml,所以有一些java Config的配置类
package com.voole.config.quartz;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@Component
public class VooleJobFactory extends AdaptableJobFactory{
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
package com.voole.config.quartz;
import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class SchedulerConfig implements SchedulerFactoryBeanCustomizer {
@Override
public void customize(SchedulerFactoryBean schedulerFactoryBean) {
schedulerFactoryBean.setAutoStartup(true);
schedulerFactoryBean.setOverwriteExistingJobs(true);
}
}
package com.voole.config.quartz;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class QuartzConfigration {
@Autowired
private VooleJobFactory vooleJobFactory;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setJobFactory(vooleJobFactory);
return bean;
}
@Bean(name="scheduler")
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
}
因为想在任务类中添加Spring的注入特性,所以上面的有些配置是做的依赖注入相关的配置信息
接着是提供的对外暴露的方法
package com.voole.platform.task;
import java.util.Map;
public class ScheduleJob {
public static final int TASK_MODEL_NOW = 0;// 立即执行
public static final int TASK_MODEL_TIME = 1;// 定时执行
public static final int TASK_MODEL_CRON = 2;//循环执行
public static final int TASK_STATUS_DO = 0;// 任务未处理
public static final int TASK_STATUS_SUCC = 1; // 任务成功
public static final int TASK_STATUS_FAIL = 2;// // 任务执行完成存在错误
public static final int TASK_STATUS_DOING = 3;// 任务正在执行
public static final int TASK_STATUS_DISCARD = 4;// 任务废弃
public static final int RECORD_STATUS_DO = 0;//任务未处理
public static final int RECORD_STATUS_SUCC = 1; //任务成功
public static final int RECORD_STATUS_FAIL = 2;//任务失败
private Long id;
private String taskType;
private int taskModel;
private String cron;
private int status;
private String taskClass;
private Map<String,String> data;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTaskType() {
return taskType;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
public int getTaskModel() {
return taskModel;
}
public void setTaskModel(int taskModel) {
this.taskModel = taskModel;
}
public String getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getTaskClass() {
return taskClass;
}
public void setTaskClass(String taskClass) {
this.taskClass = taskClass;
}
public Map<String, String> getData() {
return data;
}
public void setData(Map<String, String> data) {
this.data = data;
}
}
package com.voole.platform.task;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class JobTaskService {
private final static Logger logger = LoggerFactory.getLogger(JobTaskService.class);
//默认任务组名
public static final String DEFAULT_JOB_GROUP_NAME = "DEFAULT_JOBGROUP";
public static final String DEFAULT_TRIGGER_GROUP_NAME = "DEFAULT_TRIGGERGROUP";
@Autowired
private Scheduler scheduler;
/**
*
* <p>Title: addJob</p>
* <p>Description: 添加任务</p>
* @param job
* @param jobName
* @throws Exception
* @author 冯浩 2018年11月6日 下午3:55:13
*/
public void addJob(ScheduleJob job,String jobName) throws Exception{
if(job == null) {
return;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(!scheduler.isStarted()) {
//notify all scheduler listeners
scheduler.start();
}
JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, DEFAULT_JOB_GROUP_NAME));
if(jobDetail == null) {
Class clazz = Class.forName(job.getTaskClass());
jobDetail = JobBuilder.newJob(getClass(clazz).getClass()).withIdentity(jobName, DEFAULT_JOB_GROUP_NAME).build();
jobDetail.getJobDataMap().putAll(job.getData());
int taskModel = job.getTaskModel();
Trigger trigger = null;
if (taskModel == ScheduleJob.TASK_MODEL_TIME) {
Date startDate = dateFormat.parse(job.getCron() == null ? dateFormat.format(new Date()) : job.getCron());
trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity(jobName, DEFAULT_JOB_GROUP_NAME).startAt(startDate).build();
} else if(taskModel == ScheduleJob.TASK_MODEL_NOW){
trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity(jobName,DEFAULT_JOB_GROUP_NAME).startNow().build();
} else if(taskModel == ScheduleJob.TASK_MODEL_CRON) {
CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(job.getCron());
trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity(jobName,DEFAULT_JOB_GROUP_NAME).withSchedule(cronSchedule).build();
}
scheduler.scheduleJob(jobDetail, trigger);
}
}
public void addJob(ScheduleJob job) throws Exception {
if (job == null) {
return;
}
String jobName = job.getTaskType() + job.getId();
addJob(job, jobName);
}
/**
* 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*/
public void removeJob(String jobClassName,String jobGroupName) {
try {
scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 移除一个任务同时修改cron_task状态
* @param jobName
* @param triggerName
* @author
* @time 2016-11-24
*/
public void clearJob(String jobName,String triggerName){
try {
JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, DEFAULT_JOB_GROUP_NAME));
if(jobDetail == null){
return;
}
removeJob(jobName,triggerName);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public Job getClass(@SuppressWarnings("rawtypes") Class clazz) throws Exception {
return (Job)clazz.newInstance();
}
}
然后是测试任务
package com.voole.platform.task.job; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.stereotype.Service; @Service public class IndexJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); Object orderid = jobDataMap.get("orderid"); System.out.println(orderid); } }
最后是测试类,做的是使用controller做的任务触发
@ApiOperation(value="定时任务测试") @GetMapping("quartz") public String quartz() throws Exception { Map<String,String> data = new HashMap<>(); data.put("orderid", "123456789"); ScheduleJob job = new ScheduleJob(); job.setId(1l); job.setTaskType("order"); job.setTaskClass("com.voole.platform.task.job.IndexJob"); job.setTaskModel(ScheduleJob.TASK_MODEL_CRON); Date addMinutes = DateUtils.addMinutes(1); String format = DateUtils.format(addMinutes); job.setCron("1/2 * * * * ?"); job.setData(data); taskService.addJob(job); return "Sucess"; }
打完了!

浙公网安备 33010602011771号