springboot中整合Quartz定时器案例详解(详细代码案例)
最近因为业务需求,在springboot中需要整合Quartz,现整理分享。代码案例全部在这,注释很全,因为时间关系,文字整理比较少,多包涵。代码如下:
依赖jar包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId>
<version>2.3</version>
<scope>compile</scope>
</dependency>
注册spring-boot启动完成事件监听,用于启动job任务
@Configuration
public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> {@Autowired
public QualityScheduler qaScheduler;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
qaScheduler.scheduleJobs();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(jobFactory);
// schedulerFactoryBean.setOverwriteExistingJobs(true);
// schedulerFactoryBean.setAutoStartup(true);
return schedulerFactoryBean;
}
}
定时器任务类,实现job重写方法
添加完jar包之后,在业务层实现需要完成的业务逻辑,必须实现job(org.quartz.Job)接口
/**
* 定时任务
*/
@Slf4j
public class TestJob implements Job {
public void work(){
log.info("执行定时任务");
//此处为业务逻辑
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
work();
}
}
开启任务类QualityScheduler
我是在表现层中写的QualityScheduler,代码比较简单。
public class QualityScheduler {
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
@Autowired
BaseConfig baseConfig;
public void scheduleJobs() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
// testJob(scheduler);//去掉注释,定时任务就会开始运行
}
/**
* 开启定时检测订单情况的任务
* @param scheduler
* @throws SchedulerException
*/
private void testJob(Scheduler scheduler) throws SchedulerException{
// 1、创建JobDetial对象 , 并且设置选项
JobDetail jobDetail = JobBuilder.newJob(TestJob.class)//此处拿到业务层job类
.withIdentity("testJob", "testGroup").build();
//设置任务启动时间
//baseConfig.getOrderCron()下面会有代码案例,主要是在yml文件中配置定时器跑的时间间隔
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(baseConfig.getTestCron());
// 2、通过 TriggerBuilder 创建Trigger对象
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("testJob", "testGroup")
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
}
yml文件配置
建议此yml文件写在业务层
quartz:
cron:
test: 0 0 0/2 * * ? //这里就是调整定时器事件的配置了,各位置的含义可以百度了解
还有一个地方的yml配置(建议写在web层):
################### 是否启动quartz任务扫描 ###################
quartz:
scan: true
下面是baseconfig配置取值
@Lazy
@Data
@Configuration
public class BaseConfig {
/**
* token超时时间
*/
@Value("${quartz.cron.test}")
private String expiretime;
}
全部的代码就在这里了,祝各位好运。