SpringBoot定时任务——Quartz定时任务框架
Quartz的介绍及使用思路
概念
Quartz是JobScheduling领域开源项目,可以创建运行10个或者百个Jobs。
使用思路
- Job:任务(做什么)
- Trigger:触发器(什么时候做)
- Scheduler:任务调度(什么时候要去做什么事)
SpringBoot整合
加入依赖
- pom.xml
<!-- 添加Quartz的依赖 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!-- 添加Scheduled依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- Spring tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
编写Quartz的配置类
@Configuration
public class QuartzConfig {
/**
* 1.创建Job对象
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
//关联自己的Job类
jobDetailFactoryBean.setJobClass(QuartzDemo.class);
return jobDetailFactoryBean;
}
/**
* 2.创建Tigger对象:简单的Trigger
*/
// @Bean
// public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
// SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
// //关联JobDetail对象
// simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
// //设置方法触发时间
// simpleTriggerFactoryBean.setRepeatInterval(2000);
// //设置重复次数
// simpleTriggerFactoryBean.setRepeatCount(3);
// return simpleTriggerFactoryBean;
// }
/**
* Cron Trigger
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
//关联JobDetail对象
cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
//设置触发时间
cronTriggerFactoryBean.setCronExpression("0/2 * * * * ?");
return cronTriggerFactoryBean;
}
/**
* 3.创建Scheduler对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean simpleTriggerFactoryBean) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
//关联Trigger
schedulerFactoryBean.setTriggers(simpleTriggerFactoryBean.getObject());
return schedulerFactoryBean;
}
}
启动类
@SpringBootApplication
@EnableScheduling
public class TaskCenterApplication {
public static void main(String[] args) {
SpringApplication.run(TaskCenterApplication.class);
}
}
Job类中注入对象
注入时候产生异常
解决方法:手动将对象添加到SpringIoc中
编写一个类,手动将对象注入到SpringIoc容器中
- QuartzToSpringIoc.java
@Component("quartzToSpringIoc")
public class QuartzToSpringIoc extends AdaptableJobFactory {
//AutowireCapableBeanFactory:可以将对象添加到SpringIoc的容器中,并且完成该对象的属性注入
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
/**
* 该方法需要将实例化的任务对象手动的添加到Springioc的容器中
*/
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object object = super.createJobInstance(bundle);
//将obj对象添加到SpringIoc容器中完成注入
autowireCapableBeanFactory.autowireBean(object);
return object;
}
}
修改Quartz的配置类
/**
* 3.创建Scheduler对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean simpleTriggerFactoryBean, QuartzToSpringIoc quartzToSpringIoc) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
//关联Trigger
schedulerFactoryBean.setTriggers(simpleTriggerFactoryBean.getObject());
//将我们的配置类
schedulerFactoryBean.setJobFactory(quartzToSpringIoc);
return schedulerFactoryBean;
}
问题解决