在⽇常项⽬运⾏中,我们总会有需求在某⼀时间段周期性的执⾏某个动作。⽐如每天在某个时间段导 出报表,或者每隔多久统计⼀次现在在线的⽤户量等。
在 Spring Boot 中有 Java ⾃带的 java.util.Timer 类,也有强⼤的调度器 Quartz,还有 Spring Boot ⾃带的Scheduled 来实现。Scheduled 在 Spring3.X 引⼊,默认 SpringBoot ⾃带该功能,使⽤起来也 很简单,在启动类级别添加 @EnableScheduling 注解即可引⼊定时任务环境。但遗憾的是 Scheduled 默认不⽀持分布式环境,这⾥主要讲解 Quartz 时钟调度框架与 Spring Boot 集成。
1 环境整合配置
java
<!-- Quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2 源代码添加
2.1 定义job
com.xxxx.springboot 下添加 jobs 包,定义待执⾏ job 任务。实现 Job 接⼝,并且在 execute ⽅法 中实现⾃⼰的业务逻辑。
java
public class MyFirstJob implements Job {
private Logger log = LoggerFactory.getLogger(MyFirstJob.class);
@Override
public void execute(JobExecutionContext context) throws
JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.info(sdf.format(new Date()) + "-->" + "Hello Spring Boot
Quartz...");
}
}
2.2 构建调度配置类
创建 JobDetail 实例并定义 Trigger 注册到 scheduler ,启动 scheduler 开启调度
java
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail1(){
return JobBuilder.newJob(MyFirstJob.class).storeDurably().build();
}
@Bean
public Trigger trigger1(){
SimpleScheduleBuilder scheduleBuilder =
SimpleScheduleBuilder.simpleSchedule()
// 每⼀秒执⾏⼀次
.withIntervalInSeconds(1)
// 永久重复,⼀直执⾏下去
.repeatForever();
return TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(scheduleBuilder)
.forJob(jobDetail1())
.build();
}
// 每5秒触发⼀次任务
@Bean
public Trigger trigger2(){
return TriggerBuilder.newTrigger()
.withIdentity("trigger2", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?
*"))
.forJob(jobDetail1())
.build();
}
}
2.3 启动 StarterApplication
查看控制台打印效果: