SpringBoot + Quartz 整合maven项目实现多任务配置
maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.0</version>
</dependency>
任务1类:
@Component
@EnableScheduling
public class TimeUtils1 {
public void timer() {
System.out.println("-------任务1--------");
}
}
任务2类:
@Component
@EnableScheduling
public class TimeUtils2 {
public void timer() {
System.out.println("-------任务2--------");
}
}
QuartzConfig配置类:
@Configuration
public class QuartzConfig {
/**
* attention:
* Details:配置定时任务
*/
@Bean(name = "jobDetailFirst")
public MethodInvokingJobDetailFactoryBean jobDetailFirst(TimeUtils1 timeUtils) {// ScheduleTask为需要执行的任务
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
/*
* 是否并发执行
* 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
* 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
*/
jobDetail.setConcurrent(false);
jobDetail.setName("update-coupons");// 设置任务的名字
jobDetail.setGroup("coupons");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
/*
* 为需要执行的实体类对应的对象
*/
jobDetail.setTargetObject(timeUtils1);
/*
* timer为需要执行的方法
* 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的timer方法
*/
jobDetail.setTargetMethod("timer");
return jobDetail;
}
/**
* attention:
* Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
*/
@Bean(name = "jobTriggerFirst")
public CronTriggerFactoryBean jobTriggerFirst(JobDetail jobDetailFirst) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetailFirst);
trigger.setCronExpression("0 0 0 */1 * ?");// 初始时的cron表达式,每天0点执行一次 "0 0 0 */1 * ?"
return trigger;
}
// 配置定时任务2
@Bean(name = "jobDetailSecond")
public MethodInvokingJobDetailFactoryBean jobDetailSecond(TimeUtils2 timeUtils) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否并发执行
jobDetail.setConcurrent(false);
// 为需要执行的实体类对应的对象
jobDetail.setTargetObject(timeUtils);
// 需要执行的方法
jobDetail.setTargetMethod("timer");
return jobDetail;
}
// 配置触发器2
@Bean(name = "jobTriggerSecond")
public CronTriggerFactoryBean jobTriggerSecond(JobDetail jobDetailSecond) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetailSecond);
// cron表达式
trigger.setCronExpression("0 0 0 */1 * ?"); //每天0点执行一次
return trigger;
}
/**
* attention:
* Details:定义quartz调度工厂
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger jobTriggerFirst,Trigger jobTriggerSecond) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
bean.setOverwriteExistingJobs(true);
// 延时启动,应用启动3秒后
bean.setStartupDelay(3);
// 注册触发器
bean.setTriggers(jobTriggerFirst,jobTriggerSecond);
return bean;
}
//多任务时的Scheduler,动态设置Trigger。一个SchedulerFactoryBean可能会有多个Trigger
@Bean(name = "multitaskScheduler")
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
return schedulerFactoryBean;
}
}