SpringBoot整合Quartz定时任务的实现
前言
Quartz 设计有三个核心类,分别是 Scheduler(调度器)Job(任务)和 Trigger (触发器)
基础概念
Job
具体需要处理的业务逻辑。
JobDetail
详细的任务描述,包括名称,关联的Job,Job运行时所需要的参数等。
Trigger
任务调度器,描述什么时候执行Job,多久执行一次。
SimpleTrigger 设置重复次数,重复执行间隔时长
CronTrigger 设置Cron表达式
Scheduler
调度容器,Job与Trigger都需要在容器中注册,被容器统一管理。
Cron表达式
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 23 * * ? 每天23点执行一次
0 0 23 ? * * 每天23点执行一次
0 0 23 * * ? * 每天23点执行一次
0 0 23 * * ? 2016 2016年每天23点执行一次
0 0 1 * * ? 每天1点执行一次
0 0 1 1 * ? 每月1号1点执行一次
0 * 14 * * ? 每天14:00点到14:59期间,每隔1分钟执行一次
0 0-5 14 * * ? 每天14:00点到14:05期间,每隔1分钟执行一次
0 0 23 L * ? 每月最后一天23点执行一次
0 0 1 ? * L 每周星期六1点执行一次
0 26,29,33 * * * ? 在26分、29分、33分执行一次
0 0 0,13,18,21 * * ? 每天的0点、13点、18点、21点都执行一次
0 0 0 ? * 6#3 每月第3个星期六
SpringBoot整合Quartz
依赖
<!--quartz依赖-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!--Scheduler-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!--spring tx 坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
创建一个定时任务类
所需要的定时任务的Service层放在Job类中,Quartz就会去执行该任务。
public class QuartzJob implements Job {
@Autowired
private SysVaccineInfoService sysVaccineInfoService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
/**
* @title: 疫苗定时任务
* @description: 疫苗定时任务 server层的vaccineDateQuartz方法
* @author: X
* @updateTime: 2019/12/8 1:10
* @return: void
* @param: [jobExecutionContext]
* @throws:
*/
sysVaccineInfoService.vaccineDateQuartz();
}
}
Quartz配置类
@Configuration
public class QuartzConfig {
/**
* @description: 创建job对象
* @author: X
* @updateTime: 2019/12/9 19:47
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
//关联自己的job类
factory.setJobClass(QuartzJob.class);
return factory;
}
/**
* @description: 创建Trigger对象
* @author: X
* @updateTime: 2019/12/9 19:49
*/
/*@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
//关联JobDetail对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//执行时间(毫秒)
factory.setRepeatInterval(2000);
//执行次数
factory.setRepeatCount(5);
return factory;
}*/
/**
* @description: 创建Cron Trigger
* @author: X
* @updateTime: 2019/12/9 19:48
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
//关联JobDetail对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//执行时间(毫秒)
factory.setCronExpression("0 0 0 * * ? *");
return factory;
}
/**
* @description: 创建Scheduler对象
* @author: X
* @updateTime: 2019/12/9 19:48
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableJobFactory) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//关联trigger
factory.setTriggers(cronTriggerFactoryBean.getObject())
factory.setJobFactory(myAdaptableJobFactory);
return factory;
}
}
factory.setJobFactory(myAdaptableJobFactory);//重写AdaptableJobFactory后面会有介绍原因
运行程序此时需要注意会产生异常(空指针异常),原因是service层没有注入进来
JobDetailFactoryBean实例化job类(QuartzJob.class)时没有将该方法注入到Spring容器中。所以重写AdaptableJobFactory方法将实例化的任务对象手动的添加到SpringIOC容器中并完成对象注入。
@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory {
//AutowireCapableBeanFactory 将对象添加到SpringIOC容器中 并且完成对象注入
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
/**
* @title:
* @description: 该方法需要将实例化的任务对象手动的添加到SpringIOC容器中并完成对象注入
* @author: X
* @updateTime: 2019/12/6 21:54
* @return:
* @param:
* @throws:
*/
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj = super.createJobInstance(bundle);
//将obj对象添加到SpringIOC容器中并完成对象注入
this.autowireCapableBeanFactory.autowireBean(obj);
return obj;
}
}
我的博客还有你想知道的其他知识,欢迎浏览。∩__∩y