SpringBoot 开启并配置 @Scheduled 定时任务详解

Finn
Finn
发布时间:2026-10-16| 5人浏览过
原创

SpringBoot 提供了便捷的定时任务支持,主要通过 @EnableScheduling 开启功能,并结合 @Scheduled 注解实现。本文讲解核心配置步骤、Cron 表达式语法细节以及多节点部署时的注意事项。

启用定时任务支持

在 SpringBoot 主启动类上添加 @EnableScheduling 注解即可开启定时任务调度功能。这是使用 @Scheduled 的前提条件。

@EnableScheduling
@SpringBootApplication
public class DockerApplication {

  public static void main (String[] args) {
    SpringApplication.run(DockerApplication.class,args);
  }
}

定义并运行定时任务

创建一个普通 Java 类,标注 @Component 使其成为 Spring Bean,然后在方法上使用 @Scheduled 注解指定执行周期。以下示例演示了每秒钟执行一次的简单任务:

@Component
public class Task1 {

  // Cron表达式:秒 分 时 天 月 周几 (年)
  // ? 表示不指定具体值,常用于DayofMonth或DayofWeek冲突时
  @Scheduled(cron = "0/1 * * * * ?")
  public void doTask1(){
    System.out.println("doTask1 " +System.currentTimeMillis());
  }
}

完成以上两步,定时任务即开始运行。接下来重点解析控制执行频率的 Cron 表达式。

Cron 表达式语法详解

Cron 表达式由 7 个域组成,通常前 6 位已足够覆盖大部分需求,年份位常被省略。各字段含义及允许的特殊字符如下:

第1步:理解七个时间域

  • Seconds(秒):范围 0-59,可出现 , - * /
  • Minutes(分钟):范围 0-59,可出现 , - * /
  • Hours(小时):范围 0-23,可出现 , - * /
  • DayofMonth(日):范围 1-31,可出现 , - * / ? L W C
  • Month(月):范围 1-12,可出现 , - * /
  • DayofWeek(星期):范围 1-7 (1=周日) 或 SUN-SAT,可出现 , - * / ? L C #
  • Year(年):可选,范围 1970-2099,可出现 , - * /

第2步:掌握特殊字符含义

正确组合符号是编写精确 Cron 的关键:

  • *:匹配该域的任意值。如分钟域为 * 表示每分钟。
  • ?:只能用在 DayofMonth 和 DayofWeek。用于避免两个日期字段互相冲突。例如指定了每月1号执行,星期几就不确定,需填 ?。
  • -:表示范围。如 10-20 表示从 10 到 20。
  • /:表示递增触发。格式为 起始值/步长。例如分钟域 0/5 表示从第 0 分钟开始,每隔 5 分钟触发一次;5/10 表示在第 5, 15, 25... 分钟触发。
  • ,:表示枚举多个值。如 MON,WED,FRI。
  • L:Last,最后。在月份中表示最后一天(31日/30日等),在星期中表示 Saturday (7 或 SAT)。注意 L 不能配合数字使用(除了 L-W 范围)。
  • W:Workday,工作日。仅用于 DayofMonth。查找离指定日期最近的工作日(周一到周五)。例如 5W 表示本月 5 号最近的工作日。如果 5 号是周六,则为 4 号;如果是周日,则为下周一。W 不会跨月寻找。
  • LW:表示当月的最后一个工作日。
  • #:指定某个月的第几个星期几。格式:日期#星期序号。如 1#2 表示当月第二个星期一。

第3步:常见 Cron 示例对照

以下是常用的表达式及其对应动作:

0 * * * * ?       # 每 1 分钟执行一次
0 0 * * * ?       # 每 1 小时整点执行一次
0 0 10 * * ?      # 每天上午 10 点执行一次
0 * 14 * * ?      # 每天 14:00 - 14:59 每分钟执行一次
0 0/5 * * * ?     # 每隔 5 分钟执行一次
0 0 12-15 * * ?   # 每天 12, 13, 14, 15 点的整点各执行一次
0 0/10 15 * * ?   # 每天 15:00-15:50 期间,每隔 10 分钟执行一次
0 0 10,12,14 * * ? # 每天 10:00, 12:00, 14:00 执行一次
0 0 10 1 * ?      # 每月 1 号上午 10 点执行一次
0 10 10 10 * ?    # 每月 10 号上午 10:10 执行一次

适用场景与局限性

@Scheduled 属于 Spring 内部的单机调度机制。在单体应用或单节点部署时表现良好。但在微服务架构中,若同一服务部署了多个实例(Cluster),每个实例都会独立启动相同的定时任务,导致任务重复执行。

因此,对于需要全局唯一执行的定时任务,建议引入分布式调度框架(如 XXL-JOB, ElasticJob 等)进行统一管理,而非单纯依赖 Spring 原生注解。

辅助工具推荐

手动编写容易出错,推荐使用在线 Cron 生成器验证表达式。本站提供的在线工具地址为:
http://tools.jb51.net/code/Quartz_Cron_create

以上就是 SpringBoot Scheduling 定时任务的详细内容,更多关于 SpringBoot 定时任务配置与 Cron 表达式的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。