@Scheduled
是Spring框架中用于定时任务调度的注解,它允许我们在类的方法上声明一个方法作为定时任务,由Spring容器统一管理和执行。使用此注解后,Spring会根据注解中的属性配置,按照指定的时间规则自动调用该方法。
public class ScheduledTask {
@Scheduled(cron = "0 0/5 * * * ?") // Cron表达式,表示每5分钟执行一次
public void executeTask() {
System.out.println("定时任务执行: " + LocalDateTime.now());
// 在这里编写你需要定时执行的任务逻辑
}
// 每隔10秒钟执行一次,不考虑上一次执行是否完成
@Scheduled(fixedRate = 10000)
public void executeAtFixedRate() {
System.out.println("Fixed rate task executed at: " + LocalDateTime.now());
}
// 上一次执行完成后,间隔15秒再次执行
@Scheduled(fixedDelay = 15000)
public void executeWithFixedDelay() {
System.out.println("Fixed delay task executed at: " + LocalDateTime.now());
}
// 服务启动后延迟30秒开始执行,然后每1分钟执行一次
@Scheduled(initialDelay = 30000, fixedRate = 60000)
public void executeWithInitialDelay() {
System.out.println("Task with initial delay executed at: " + LocalDateTime.now());
}
}
Cron
是 Linux 和 Unix 系统上用于定时任务的工具。它通过 Cron 表达式来定义任务的执行时间,并通过计划任务来调度任务的执行。
* * * * * *
| | | | | |
| | | | | ----- 星期(0-7,其中0和7都代表周日)
| | | | ------- 月份(1-12)
| | | --------- 日期(1-31)
| | ----------- 小时(0-23)
| ------------- 分钟(0-59)
--------------- 秒 (0-59,默认不使用时可以省略)
0-23
表示“0 到 23”
*
表示“每”
/
表示“除以”,所以 */3
表示“每 3 小时”。
?
举例理解:在表星期几中,?
通常意味着“不论周几”
MON#1
表示每个月的第一个周一
* * * * * *
:这意味着这个任务会在每秒钟执行一次。但请注意,Spring Boot定时任务通常不包含秒级精度,而是从分钟开始,因此最小粒度的cron表达式通常是 * * * * *
,表示每分钟执行一次。
*/5 * * * * ?
:在秒级别,表示每5秒执行一次(尽管标准的Unix cron不支持秒级调度,但在某些如Spring框架的实现中可以支持秒)
0 */1 * * * ?
和 0 0/1 * * * ?
是没有区别的:每隔1分钟执行一次
0 0 1 * * ?
:每天凌晨1点执行一次
0 0 0 1 * ?
:每月的1号执行,而不在乎是周几
0 0 1 1 * ?
:每月1号凌晨1点执行: