前言
我们在开发系统时,可能会要使用到定时任务模块,比如:订单超时取消。目前常用的有:jdk 自带的Timer、ScheduledExecutorService线程池、spring定时任务、Quartz、elastic-job、 XXL-JOB这几个工具,其中后两个是基于Quartz进行开发的。这里我用的是Quartz,使用springboot进行整合。
开发
1.导maven包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.在启动类上加上注解@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication .class, args);
}
}
3.编写Quartz job类
public class MyJob implements Job {
/**
* 业务类注入
*/
@Resource
private MyService MyService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//这里做测试只用简单逻辑打印时间,也可以使用业务逻辑
System.out.println("执行了任务:" + LocalDateTime.now());
}
}
4.由于Quartz创建job时是基于反射来的,所以第三步的类进行MyService 注入时会报错,因为他执行Quartz时并没有加入到spring IOC容器,这里我们重写Quartz中的一个类,在配置类在使用,使得业务类能成功注入。
@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
5.编写配置类
@Configuration
public class QuartzConfig {
/**
* jobDetail
* @return
*/
@Bean
public JobDetailFactoryBean getJobDetailFactoryBean() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(MyJob.class);
return factory;
}
/**
* Trigger
* @param jobDetailFactoryBean
* @return
*/
@Bean
public SimpleTriggerFactoryBean getSimpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
factory.setJobDetail(jobDetailFactoryBean.getObject());
//每隔三秒执行一次job作业
factory.setRepeatInterval(3000);
return factory;
}
/**
* Scheduler
* @param simpleTriggerFactoryBean
* @param adaptableJobFactory
* @return
*/
@Bean
public SchedulerFactoryBean getSchedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean, MyAdaptableJobFactory adaptableJobFactory) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setTriggers(simpleTriggerFactoryBean.getObject());
//将业务类手动添加到Spring IOC容器
factory.setJobFactory(adaptableJobFactory);
return factory;
}
}