Spring Boot快速集成Quartz定时任务框架
第一步:pom.xml加入Quartz依赖
<!-- Quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
这里使用集成好的快速启动器,不需要手动指定版本和像以往一样手动导入
第二步:自定义JOB任务类
继承QuartzJobBean类 或者是 实现Job接口,这两种方式都有一个函数需要我们重写
两种方式没有差别,选择一种即可。
这里使用实现接口的形式。注意这里自定义的类的名称Job与Quartz里面的接口名称Job重名了,IDEA自动帮我们使用了全类名导入。
@Component
public class Job implements org.quartz.Job {
@Autowired
TeatSeriver teatSeriver;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("定时任务执行:" + System.currentTimeMillis());
teatSeriver.t1();
}
}
在这里调用了Seriver层的方法,下面附上Seriver层的方法:
@Service
public class TeatSeriver {
public void t1(){
System.out.println("Seriver类的T1方法被调用!");
}
}
Seriver层就一个方法t1
第三步:配置Quartz的调度器并注入到IOC中
下面要配置好Quartz的调度器并添加到IOC容器里面去。
//调度器配置类,在IOC容器里面添加一个调度器
@Configuration
public class SchedulerConfig {
@Autowired
MyJobFactory myJobFactory;
@Bean
public Scheduler scheduler(){
return schedulerFactoryBean().getScheduler();
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
//设置调度器名字
schedulerFactoryBean.setSchedulerName("自定义调度器1");
//设置启动时间 推迟指定秒数后启动
// schedulerFactoryBean.setStartupDelay(5);
//设置启动时间 立即启动
schedulerFactoryBean.start();
//设置JOB的构造工厂为我们自己定义的工厂
schedulerFactoryBean.setJobFactory(myJobFactory);
return schedulerFactoryBean;
}
}
重点:该处配置类SchedulerConfig注入了一个我们自己定义的类MyJobFactory。
因为Quartz中任务执行时会实例化任务类,而这个实例化是由Quartz进行的。如果不配置,那么任务类中调用Spring Seriver层的方法时会报空指针异常。(Quartz实例化无法注入Spring容器的Bean)。所以我们需要将这个实例化过程让Spring插一手进来,保证Spring的依赖可以成功注入。
@Component
public class MyJobFactory extends AdaptableJobFactory {
//拿到Spring的构造工厂
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
//解决Job任务类里面自动注入问题
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 使用Spring的构造工厂进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
该类继承AdaptableJobFactory ,重写了Quartz实例化Job任务类的方法createJobInstance。我们在调用了父类方法后,让Spring插了一手进来。这样就解决了问题。
第四步:添加定时任务
接下来是Controller层方法,会添加一个定时任务到调度器里面去。
@RestController
public class HelloController {
private final static Logger logger = LoggerFactory.getLogger(HelloController.class);
@Autowired
Scheduler scheduler;
@Autowired
TeatSeriver teatSeriver;
@RequestMapping("/log")
public String log(){
logger.trace("-------------------");
JobDetail jobDetail = JobBuilder.newJob(Job.class)
.withIdentity("任务1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("触发器1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
.build();
//加入调度程序
try {
scheduler.scheduleJob(jobDetail,trigger);
// scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
return "Log OK";
}
}
至于任务添加后,动态的删除、修改定时任务,下次再写。