第一步:引入依赖
org.quartz-scheduler
quartz
2.3.0
org.quartz-scheduler
quartz-jobs
2.3.0
org.springframework
spring-context-support
第二步:创建MySQL表,Quartz是基于表来感知其他定时任务节点的,节点间不会直接通信。建表语句在jar包中自带了。
org\quartz-scheduler\quartz\2.3.0\quartz-2.3.0.jar!\org\quartz\impl\jdbcjobstore\tables_mysql_innodb.sql
第三步:配置线程池,我这里是因为项目的其他地方有用到线程池,你也可以选择在Quartz的配置类中注入。
(我在其他位置使用了线程池,占用了一个线程,所以当我将核心线程数量设置为1时,定时任务不会执行;需确保有足够的线程来执行)
importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;importjava.util.concurrent.Executor;importjava.util.concurrent.ThreadPoolExecutor;/*** @Author 1
* @Description 配置线程池交给Spring容器管理
* @Date 2020/8/26 18:23
**/@Configurationpublic classExecturConfig {
@Bean("taskExector")publicExecutor taskExector() {
ThreadPoolTaskExecutor executor= newThreadPoolTaskExecutor();//核心线程池数量
executor.setCorePoolSize(2);//最大线程数量
executor.setMaxPoolSize(5);//线程池的队列容量
executor.setQueueCapacity(10);//线程名称的前缀
executor.setThreadNamePrefix("expireOrderHandle-");//配置拒绝策略
executor.setRejectedExecutionHandler(newThreadPoolExecutor.AbortPolicy());
executor.initialize();returnexecutor;
}
}
第四步:因为定时任务业务中需要使用到注入Spring容器的类,所以配置注入,否则报空指针异常。
importorg.quartz.spi.TriggerFiredBundle;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.config.AutowireCapableBeanFactory;importorg.springframework.scheduling.quartz.AdaptableJobFactory;importorg.springframework.stereotype.Component;
@Component("myAdaptableJobFactory")public class MyAdaptableJobFactory extendsAdaptableJobFactory {//AutowireCapableBeanFactory 可以将一个对象添加到SpringIOC容器中,并且完成该对象注入
@AutowiredprivateAutowireCapableBeanFactory autowireCapableBeanFactory;/*** 该方法需要将实例化的任务对象手动的添加到springIOC容器中并且完成对象的注入*/@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throwsExceptio