Appearance
Spring Boot 定时任务调度概述
定时任务是企业级开发中必不可少的组成部分,诸如长周期业务数据的计算,例如年度报表,诸如系统脏数据的处理,再比如系统性能监控报告,还有抢购类活动的商品上架,这些都离不开定时任务。Spring Boot 提供了整合第三方任务调度框架的功能
Quartz 调度器整合
相关概念
Quartz 是一款比较成熟的定时任务框架,本身使用时配置略微复杂。Spring Boot 对其进行整合后,简化了一系列的配置,多数配置均可采用默认设置。Quartz 涉及的概念如下:
- 工作(Job):用于定义具体执行的工作
- 工作明细(JobDetail):用于描述定时工作相关的信息
- 触发器(Trigger):描述了工作明细与调度器的对应关系
- 调度器(Scheduler):用于描述触发工作的执行规则,通常使用 cron 表达式定义规则
整合示例
项目依赖
在项目的 pom.xml 文件中引入 Spring Boot 整合 Quartz 的 spring-boot-starter-quartz 依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>创建定时任务
按照 Quartz 框架的开发规范,创建定时任务类,该继承 org.springframework.scheduling.quartz.QuartzJobBean,实现任务调度时执行的方法 executeInternal
java
public class MyQuartzJob extends QuartzJobBean {
/**
* 任务执行的核心方法
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("MyQuartzJob task run...");
}
}创建 Quartz 配置类
创建 Quartz 配置类,类中定义工作明细(JobDetail)与触发器(Trigger)的对象实例
java
@Configuration
public class QuartzConfig {
/**
* 创建 JobDetail 工作明细实例
*/
@Bean
public JobDetail createJobDetail() {
// 绑定具体的任务类
return JobBuilder.newJob(MyQuartzJob.class)
.storeDurably()
.build();
}
/**
* 创建 Trigger 任务触发器实例
*/
@Bean
public Trigger createJobTrigger() {
// 使用 cron 表达式定义执行规则
ScheduleBuilder<CronTrigger> schedBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
// 绑定对应的工作明细对象
return TriggerBuilder.newTrigger().forJob(createJobDetail())
.withSchedule(schedBuilder).build();
}
}在工作明细实例中,要设置对应的具体工作实现类 MyQuartzJob,使用 newJob() 方法传入对应的工作任务类型即可。
触发器需要绑定任务,使用 forJob() 方法传入绑定的工作明细对象。此处可以为工作明细设置名称然后使用名称绑定,也可以直接调用对应方法绑定。触发器中最核心的规则是执行时间,此处使用调度器定义执行时间,执行时间描述方式使用的是 cron 表达式。
功能测试
启动程序,观察控制台是否每5秒输出一次结果
Spring Task 任务调度整合
概述
上述的 Quartz 框架将其中的对象划分粒度过细,导致开发的时候有点繁琐,Spring 针对上述规则进行了简化,开发了自己的任务管理组件 - Spring Task。
Spring 根据定时任务的特征,将定时任务的开发简化成只需要定义任务并加入到 Spring 容器,再定义其任务的执行规则即可。
整合示例
开启定时任务功能
在启动类或者配置类上,标识 @EnableScheduling 注解,开启定时任务功能
java
@SpringBootApplication
@EnableScheduling // 开启定时任务功能
public class TaskSchedulingApplication {
public static void main(String[] args) {
SpringApplication.run(TaskSchedulingApplication.class, args);
}
}创建任务类与执行规则
创建任务类,在相应需要定时执行的方法上标识 @Scheduled 注解,通过 cron 属性定义其执行的时间,执行时间的描述方式还是 cron 表达式
java
@Component
public class MySpringTask {
/*
* @Scheduled 注解用于标识任务调度时执行的方法,通过 cron 属性来定义任务执行的规则
*/
@Scheduled(cron = "0/3 * * * * ?")
public void doSomething() {
System.out.println(Thread.currentThread().getName() + " : spring task run...");
}
}功能测试
启动程序,观察控制台是否每3秒输出一次结果
Spring Task 相关配置
可以项目配置文件,对 Spring Task 定时任务进行相关配置
yml
spring:
task:
scheduling:
pool:
size: 1 # 任务调度线程池大小 默认 1
thread-name-prefix: spring_tasks_ # 调度线程名称前缀 默认 scheduling-
shutdown:
await-termination: false # 线程池关闭时等待所有任务完成
await-termination-period: 10s # 调度线程关闭前最大等待时间,确保最后一定关闭@Scheduled 支持的参数
cron:cron 表达式,指定任务在特定时间执行。fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为 long,单位 ms。fixedDelayString:与fixedDelay含义一样,只是参数类型变为 String。fixedRate:表示按一定的频率执行任务,参数类型为 long,单位 ms。fixedRateString:与fixedRate的含义一样,只是将参数类型变为 String。initialDelay:表示延迟多久再第一次执行任务,参数类型为 long,单位 ms。initialDelayString:与initialDelay的含义一样,只是将参数类型变为 String。zone:时区,默认为当前时区,一般没有用到。