Quartz介绍
Quartz可以实现创建任务,修改任务周期等等功能,可以通过javaconfig配置任务调度,并在启动时执行,也可以动态创建任务。SpringBoot也集成了Quartz框架,并提供spring-boot-starter-quartz依赖。
Quartz中几个核心概念:
- SchedulerFactoryBean:用来创建,配置一个Scheduler,并管理其生命周期。
- Trigger:触发器,作用是任务何时执行。通过TriggerBuilder创建实例。
- JobDetail:定义一个特定的Job,它通过JobBuilder来创建实例。
环境
SpringBoot版本:1.5.14.RELEASE
通过@Configuration静态配置Quartz
POM依赖
引入Quartz的相关依赖
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- spring集成quartz -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- 因为SchedulerFactoryBean中依赖了org.springframework.transaction.PlatformTransactionManager,所以需依赖tx相关包,其实还是quartz有个分布式功能,是使用数据库完成的。 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
实现步骤
1.创建MethodInvokingJobDetailFactoryBean工厂类,设置目标对象和执行方法
2.通过第一步创建的工厂类创建触发器
3.创建任务调度工厂类,并注册触发器
编写如下配置类:
package com.bcu.springboot.biz.config;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
import lombok.extern.slf4j.Slf4j;
import org.quartz.CronTrigger;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
@Configuration
@Slf4j
public class QuartzConfig {
/**
* 创建工厂bean,实现自定义调度类
* @return
*/
@Bean
public MethodInvokingJobDetailFactoryBean createFactoryBean(){
MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();
//设置执行对象
factoryBean.setTargetBeanName("quartzTask");
//设置执行方法
factoryBean.setTargetMethod("quartzTask");
//设置任务是否并发执行,true:任务并发执行,false:上一个任务执行完,下一个任务才开始执行
factoryBean.setConcurrent(true);
return factoryBean;
}
/**
* 通过工厂bean创建trigger触发器
* @param factoryBean
* @return
* @throws ParseException
*/
@Bean
public Trigger cronTrigger(MethodInvokingJobDetailFactoryBean factoryBean) throws ParseException{
CronTriggerFactoryBean triggerBean = new CronTriggerFactoryBean();
//设置trigger所属的工厂bean
triggerBean.setJobDetail(factoryBean.getObject());
//设置执行周期
triggerBean.setCronExpression("0/3 * * * * ?");
triggerBean.setName("customTrigger");
//在bean属性填充完成后,执行初始化,如果配置出错则抛出异常
triggerBean.afterPropertiesSet();
return triggerBean.getObject();
}
/**
* 创建调度工厂类,自动注册trigger
* @param triggers
* @return
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTrigger... triggers){
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
//当triggers为null时,报异常
factoryBean.setTriggers(triggers);
return factoryBean;
}
@Component("quartzTask")
public class QuartzTask{
public void quartzTask() {
DateFormatter df = new DateFormatter("yyyyMMdd HH:mm:ss");
System.out.println("["+Thread.currentThread().getName()+"]执行任务,当前时间:"+df.print(new Date(), Locale.CHINA));
}
}
}
动态创建Quartz
首先,创建一个Job工厂,用于将Job实例注入到Job工厂中
package com.bcu.springboot.biz.quartz;
import org.qu