首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot @Scheduled 注解详解

SpringBoot @Scheduled 注解详解

作者头像
varin
发布2025-09-28 13:12:42
发布2025-09-28 13:12:42
1300
代码可运行
举报
文章被收录于专栏:/root/root
运行总次数:0
代码可运行

让方法周期性自动执行,轻松实现定时任务!


作用

为方法添加定时任务功能,支持按固定间隔、延迟或Cron表达式触发执行。 基于Spring Task调度,适用于日志清理、数据同步等周期性场景。


使用方法
  1. 启用定时任务 启动类添加 @EnableScheduling
代码语言:javascript
代码运行次数:0
运行
复制
@SpringBootApplication
@EnableScheduling
public class App { ... }
  1. 标注需执行的方法

在方法上添加 @Scheduled,并指定触发规则:

代码语言:javascript
代码运行次数:0
运行
复制
@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() { ... }
}

注意点
  • 单线程阻塞:默认单线程执行任务,耗时任务会阻塞后续任务 → 需配置线程池(示例):
代码语言:javascript
代码运行次数:0
运行
复制
@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

* , - / ? 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点执行

年度初始化任务


特殊规则扩展表
在这里插入图片描述
在这里插入图片描述
注意事项
  1. 验证工具:使用 Cron表达式在线生成器 或 IDEA插件校验合法性。
  2. 时区问题:默认跟随服务器时区,可通过 zone = "GMT+8" 显式指定(如北京时间)。
  3. 性能避坑:避免秒级高频任务导致线程阻塞,必要时结合 @Async 异步执行。

📌 复制即用,效率翻倍!


最佳实践
  • 轻量级任务用 @Scheduled,复杂场景用 Quartz
  • 任务方法避免长时间阻塞,必要时拆分成异步任务(@Async)。
  • 通过 cron-validator 库或在线工具校验表达式合法性。

掌握 @Scheduled,轻松实现精准调度! 🚀

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作用
  • 使用方法
  • 注意点
  • Cron表达式详解
  • 高频Cron表达式表
  • 特殊规则扩展表
  • 注意事项
  • 最佳实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档