SpringBoot 开启并配置 @Scheduled 定时任务详解
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,可出现
,-*/?LWC - Month(月):范围 1-12,可出现
,-*/ - DayofWeek(星期):范围 1-7 (1=周日) 或 SUN-SAT,可出现
,-*/?LC# - 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 表达式的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









