让方法周期性自动执行,轻松实现定时任务!
作用
为方法添加定时任务功能,支持按固定间隔、延迟或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 { @Override public 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 |
|
月 |
1-12 或 JAN-DEC |
|
周 |
1-7 或 SUN-SAT |
|
常用符号
*
:任意值?
:不指定(用于日或周字段冲突时)-
:范围(如10-20
)/
:间隔(如0/5
秒 → 每5秒)L
:最后一天(日)/ 最后一周(周)W
:最近工作日(如15W
当月15日最近的工作日)
高频Cron表达式表
(6位格式:秒 分 时 日 月 周,兼容Spring Task)
表达式 |
说明 |
应用场景示例 |
|
每隔10秒执行一次 |
实时监控、数据刷新 |
|
每隔5分钟执行一次 |
定时拉取API数据 |
|
每小时整点执行 |
日志归档、缓存清理 |
|
每天9点到18点整点执行 |
工作日定时通知任务 |
|
每天中午12点执行 |
统计日报生成 |
|
每天凌晨0点执行 |
日终数据结算 |
|
每月1号凌晨0点执行 |
月度报表生成 |
|
每周一至周五早上8点执行( |
工作日晨间任务 |
|
每月最后一天上午10点执行( |
月末数据备份 |
|
每月最后一个工作日的0点执行 |
避免在非工作日执行月末任务 |
|
每月3日最近的工作日0点执行(若3日为周末则提前) |
避开周末的固定日任务 |
|
每年1月1日0点执行 |
年度初始化任务 |
特殊规则扩展表
符号/规则 |
示例 |
解析 |
间隔触发 |
|
每天9点到17点,每30分钟执行一次 |
范围触发 |
|
每天8点、12点、18点各执行一次 |
随机延迟 |
|
每天10:05和10:35执行 |
不指定 |
|
每周一0点执行(忽略具体日期) |
最后一天 |
|
每月倒数第3天0点执行 |
周内第N天 |
|
每月第3个周五0点执行( |
注意事项
- 验证工具:使用 Cron表达式在线生成器 或 IDEA插件校验合法性。
- 时区问题:默认跟随服务器时区,可通过
zone = "GMT+8"
显式指定(如北京时间)。 - 性能避坑:避免秒级高频任务导致线程阻塞,必要时结合
@Async
异步执行。
📌 复制即用,效率翻倍!
最佳实践
- 轻量级任务用
@Scheduled
,复杂场景用 Quartz。 - 任务方法避免长时间阻塞,必要时拆分成异步任务(
@Async
)。 - 通过
cron-validator
库或在线工具校验表达式合法性。
掌握 @Scheduled
,轻松实现精准调度! 🚀