SpringBoot 定时任务 @Scheduled 详细解析
@Scheduled
@Scheduled
是Spring框架提供的一个注解,用于在Spring应用中定义定时任务。通过使用 @Scheduled
注解,可以简化配置和管理定时任务流程,无需编写复杂的调度逻辑。
启动定时任务
在使用 @Scheduled
注解之前,需要在Spring配置类中启用定时任务支持。通常在Spring Boot应用的主配置类上添加 @EnableScheduling
注解。
定义定时任务
在需要执行定时任务的方法前,自定义@Scheduled
的调度策略
1. cron (常用)
使用Cron表达式来指定调度时间。Cron表达式是一个字符串,用于定义任务的执行时间。
cron表达式格式
秒 分 时 日 月 周 年(可选)
例如:
“0 0 1 * * ?”:每天凌晨1点执行。
“0 0/5 * * * ?”:每5分钟执行一次。
“0 0 12 ? * WED”:每周三中午12点执行。
@Scheduled(cron = "0 0 1 * * ?")
public void cronTask() {
System.out.println("Cron task - " + System.currentTimeMillis());
}
2. fixedRate
每隔固定的时间间隔执行一次任务。无论上一次任务是否完成,都会在指定的时间间隔后再次启动任务。
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
System.out.println("Fixed rate task - " + System.currentTimeMillis());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3. fixedDelay
在上一次任务完成后,等待固定的时间间隔再执行下一次任务。
@Scheduled(fixedDelay = 3000)
public void fixedDelayTask() {
System.out.println("Fixed delay task - " + System.currentTimeMillis());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
4. initialDelay
首次执行任务前的延迟时间,可以与 fixedRate 或 fixedDelay 一起使用。适用于不想让任务立即执行的情况
@Scheduled(initialDelay = 2000, fixedRate = 5000)
public void initialDelayTask() {
System.out.println("Initial delay task - " + System.currentTimeMillis());
}
5. zone
用于指定定时任务的时间区域(时区)。这对于跨时区的应用非常重要,因为它确保定时任务在指定的时区中按预期时间执行。就像下面这个例子,每天在北京时间凌晨一点执行,而不是美国中部时间的1点。
@Scheduled(cron = "0 0 1 * * ?", zone = "Asia/Shanghai")
public void scheduledTask() {
// 任务逻辑
}
6. timeUnit
用于指定时间的间隔单位,默认为 毫秒
- TimeUnit.NANOSECONDS:纳秒
- TimeUnit.MICROSECONDS:微秒
- TimeUnit.MILLISECONDS:毫秒
- TimeUnit.SECONDS:秒
- TimeUnit.MINUTES:分钟
- TimeUnit.HOURS:小时
- TimeUnit.DAYS:天
@Scheduled(fixedRate = 5, timeUnit = TimeUnit.SECONDS)
public void scheduledTask() {
}