SpringBoot @Scheduled 注解详解
让方法周期性自动执行,轻松实现定时任务!
作用
为方法添加定时任务功能,支持按固定间隔、延迟或Cron表达式触发执行。
基于Spring Task调度,适用于日志清理、数据同步等周期性场景。
使用方法
- 启用定时任务
启动类添加@EnableScheduling
:
@SpringBootApplication
@EnableScheduling
public class App { ... }
- 标注需执行的方法
在方法上添加 @Scheduled
,并指定触发规则:
@Component
public class TaskService {// 方式1:固定速率(间隔时间包含任务执行时间)@Scheduled(fixedRate = 5000) // 每5秒执行一次public void task1() { ... }// 方式2:固定延迟(任务完成后间隔指定时间)@Scheduled(fixedDelay = 3000) // 任务结束3秒后再次执行public void task2() { ... }// 方式3:Cron表达式(灵活控制时间)@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行public void task3() { ... }
}
注意点
- 单线程阻塞:默认单线程执行任务,耗时任务会阻塞后续任务 → 需配置线程池(示例):
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));}
}
- 时区问题:Cron表达式默认使用服务器时区 → 指定时区:
@Scheduled(cron="0 0 0 * * ?", zone="Asia/Shanghai")
- 分布式问题:多实例部署会导致任务重复执行 → 结合Redis锁或使用分布式调度框架(如Quartz)。
Cron表达式详解
格式:秒 分 时 日 月 周 年(可选)
字段 | 允许值 | 特殊符号 |
---|---|---|
秒 | 0-59 | * , - / ? |
分 | 0-59 | 同上 |
时 | 0-23 | 同上 |
日 | 1-31 | * , - / ? L W |
月 | 1-12 或 JAN-DEC | * , - / |
周 | 1-7 或 SUN-SAT | * , - / ? L # |
常用符号
*
:任意值?
:不指定(用于日或周字段冲突时)-
:范围(如10-20
)/
:间隔(如0/5
秒 → 每5秒)L
:最后一天(日)/ 最后一周(周)W
:最近工作日(如15W
当月15日最近的工作日)
高频Cron表达式表
(6位格式:秒 分 时 日 月 周,兼容Spring Task)
表达式 | 说明 | 应用场景示例 |
---|---|---|
0/10 * * * * ? | 每隔10秒执行一次 | 实时监控、数据刷新 |
0 0/5 * * * ? | 每隔5分钟执行一次 | 定时拉取API数据 |
0 0 * * * ? | 每小时整点执行 | 日志归档、缓存清理 |
0 0 9-18 * * ? | 每天9点到18点整点执行 | 工作日定时通知任务 |
0 0 12 * * ? | 每天中午12点执行 | 统计日报生成 |
0 0 0 * * ? | 每天凌晨0点执行 | 日终数据结算 |
0 0 0 1 * ? | 每月1号凌晨0点执行 | 月度报表生成 |
0 0 8 ? * 2-6 | 每周一至周五早上8点执行(2-6 =周一~周五) | 工作日晨间任务 |
0 0 10 L * ? | 每月最后一天上午10点执行(L =最后一天) | 月末数据备份 |
0 0 0 LW * ?** | 每月最后一个工作日的0点执行 | 避免在非工作日执行月末任务 |
0 0 0 3W * ? | 每月3日最近的工作日0点执行(若3日为周末则提前) | 避开周末的固定日任务 |
0 0 0 1 1 ? | 每年1月1日0点执行 | 年度初始化任务 |
特殊规则扩展表
注意事项
- 验证工具:使用 Cron表达式在线生成器 或 IDEA插件校验合法性。
- 时区问题:默认跟随服务器时区,可通过
zone = "GMT+8"
显式指定(如北京时间)。 - 性能避坑:避免秒级高频任务导致线程阻塞,必要时结合 @Async 异步执行。
📌 复制即用,效率翻倍!
最佳实践
- 轻量级任务用
@Scheduled
,复杂场景用 Quartz。 - 任务方法避免长时间阻塞,必要时拆分成异步任务(
@Async
)。 - 通过
cron-validator
库或在线工具校验表达式合法性。
掌握 @Scheduled
,轻松实现精准调度! 🚀