在Spring Boot中,Spring Task 是一个内置的轻量级定时任务框架,无需引入额外依赖,即可实现周期性任务的调度。它基于Spring Framework的`spring-context`模块,通过注解方式配置,使用简单且功能强大。
核心使用步骤
- 启用定时任务
在Spring Boot应用的主启动类上添加 `@EnableScheduling` 注解,以开启定时任务功能。
```java
@SpringBootApplication
@EnableScheduling
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
```
- 定义定时任务
创建一个Spring管理的Bean(使用 `@Component` 等注解),并在需要定时执行的方法上使用 `@Scheduled` 注解来指定执行策略。
```java
@Component
public class MyTask {
// 每隔5秒执行一次(从上一次执行开始计时)
@Scheduled(fixedRate = 5000)
public void taskWithFixedRate() {
System.out.println("Fixed Rate Task executed at: " + LocalDateTime.now());
}
// 上一次任务执行结束后,等待2秒再执行下一次
@Scheduled(fixedDelay = 2000)
public void taskWithFixedDelay() {
System.out.println("Fixed Delay Task executed at: " + LocalDateTime.now());
}
// 使用Cron表达式,每天凌晨2点执行
@Scheduled(cron = "0 0 2 * * ?")
public void taskWithCron() {
System.out.println("Cron Task executed at: " + LocalDateTime.now());
}
}
```
`@Scheduled` 注解的三种执行策略
-
`fixedRate`: 以固定的频率执行任务,间隔时间从每次任务的开始时刻算起。如果任务执行时间超过间隔时间,下一次任务会立即开始,可能导致任务并发执行。
-
`fixedDelay`: 以固定的延迟执行任务,间隔时间从每次任务的结束时刻算起。这能确保上一次任务完全结束后,才开始计算下一次的等待时间,更安全。
-
`cron`: 使用Cron表达式来指定复杂的调度规则,例如"每周一上午9点"或"每月1号的午夜"。这是最灵活的方式。
关键注意事项
-
必须选择一种策略:在 `@Scheduled` 注解中,必须且只能指定 `fixedRate`、`fixedDelay` 或 `cron` 三者之一。
-
单线程默认执行:Spring Task 默认使用单线程执行所有定时任务。如果一个任务执行时间过长,会阻塞其他任务的执行。如需并行执行,可以配置自定义的 `TaskScheduler`。
-
Cron表达式格式:标准的Cron表达式包含6或7个字段(秒、分、时、日、月、周、年),Spring Task 支持7个字段的格式。
通过以上方式,即可在Spring Boot应用中轻松实现各种定时任务需求。