Spring Boot 1.x 集成Quartz定时任务调度框架
由于项目用到定时任务,而Spring Boot的Scheduled不支持每个月最后一天的表达式;然后通过百度找了下目前比较流行的定时任务调度,最后领导决定用Quartz(其实就是因为Quartz听过,其他的没听过所以就不考虑了)。
网上找了很多例子,要么是Spring配置文件的,要么是以Spring Boot 2.0整合的,所以都不能使用。最后研究了下Quartz发现好像是配置的问题。
直接上代码,整合即用。
POM文件:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
多余的pom就不上了。
配置类:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
@Configuration
public class TaskConfig {
@Bean
public JobDetail jobDetail() {
return new JobDetail();
}
@Bean
public Scheduler scheduler(JobDetail jobDetail) {
Scheduler scheduler = null;
try {
scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(detailFactoryBean(jobDetail).getObject(), assetDepreciationJobDetailTrigger());
} catch (SchedulerException e) {
e.printStackTrace();
}
return scheduler;
}
@Bean(name = "detailFactoryBean")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(JobDetail jobDetail) {
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
bean.setTargetObject(jobDetail); // Job类
bean.setTargetMethod("job"); // Job方法名称
bean.setConcurrent(false);
return bean;
}
private Trigger assetDepreciationJobDetailTrigger() {
// SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.repeatHourlyForever();
// Cron类型的定时任务
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("20 05 15 * * ?");
return TriggerBuilder.newTrigger()
.withIdentity("quartzTaskService")
.withSchedule(cronScheduleBuilder)
.build();
}
}
Job类:
public class JobDetail {
public void job() {
System.out.println("123456");
}
}