项目中需要用到定时任务,考虑了下java方面定时任务无非就三种:
- 用Java自带的timer类。稍微看了一下,可以实现大部分的指定频率的任务的调度(timer.schedule()),也可以实现关闭和开启(timer.cancle)。但是用其来实现某天的某个时间或者某月的某一天调度任务有点不方便。
- 采用Quartz 调度器实现。这是一个功能很强大的开源的专门用于定时任务调度的框架,也很好的和springboot整合,缺点:配置复杂,需要花费一定的时间去了解和研究。
- spring3.0以后自带的scheduletask任务调度,可以实现quartz的大部分功能,不需要额外引用jar,也不需要另外配置。而且支持注解和配置文件两种。
鉴于项目有些地方要考虑动态管理定时任务的,所以考虑吧quartz也集成进去,方便调用。
一、首先引入依赖(必需)
<!--任务调度相关依赖--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency>
二、创建job 实例工厂,解决spring注入问题,如果使用默认会导致spring的@Autowired 无法注入问题
1 package com.qunyi.jifenzhi_zx.core.quartz.taskjobfactory; 2 3 import org.quartz.spi.TriggerFiredBundle; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 6 import org.springframework.scheduling.quartz.AdaptableJobFactory; 7 import org.springframework.stereotype.Component; 8 9 /** 10 * @author xujingyang 11 * @Description: 解决quartz无法注入spring bean问题 12 * @date 2018/5/30. 13 */ 14 @Component 15 public class TaskJobFactory extends AdaptableJobFactory { 16 @Autowired 17 private AutowireCapableBeanFactory capableBeanFactory; 18 19 @Override 20 protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { 21 //调用父类的方法 22 Object jobInstance = super.createJobInstance(bundle); 23 //进行注入 24 capableBeanFactory.autowireBean(jobInstance); 25 return jobInstance; 26 } 27 }