⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7496369162485317647 「小厂永远得不到的男人」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

一、Spring Task是什么?程序员的”私人助理”

想象你有个24小时待命的英国管家:

  • 早上6点:自动帮你煮咖啡(数据备份)
  • 中午12点:准时提醒你吃饭(系统监控)
  • 凌晨3点:偷偷帮你抢茅台(定时任务)

这就是Spring Task的本质——让程序学会自己”定闹钟”!相比传统的Timer,它就像从诺基亚升级到iPhone:

二、3步打造你的时间管理大师

2.1 添加”机械心脏”(依赖注入)

<!-- 使用前先安装"发条" -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

Spring Boot 2.x+版本已经内置定时任务模块,无需额外添加依赖

2.2 启动”定时芯片”(启用注解)

@SpringBootApplication
@EnableScheduling // 给程序装上定时芯片
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}

2.3 编写”日程表”(定时方法)

@Component
public class MyTask {

// 每天23:59:59执行(打工人日报提醒)
@Scheduled(cron = "59 59 23 * * ?")
public void dailyReport() {
System.out.println("【系统提示】记得写日报!");
}
}

三、Cron表达式:时间管理的摩斯密码

3.1 7位密码解析器

秒 分 时 日 月 周 年(可选)

记忆口诀: “秒杀时分日月周年”

3.2 常用组合姿势

3.3 特殊符号说明书

  • *:比老板的要求更野(每时每刻)
  • ?:佛系青年专用(不指定具体值)
  • L:最后的倔强(最后一天)
  • W:社畜必修(最近工作日)
  • #:霸道总裁选择(第N个周X)

四、六大应用场景:解放生产力的秘密武器

4.1 数据同步:系统间的”快递小哥”

@Scheduled(fixedRate = 3600000) // 每小时跑腿一次
public void syncOrderStatus() {
// 把订单系统的状态"搬运"到物流系统
}

4.2 日志清理:数字世界的扫地机器人

@Scheduled(cron = "0 0 3 * * ?") // 每天凌晨3点打扫
public void cleanLogs() {
// 把7天前的日志文件"扫"进回收站
}

4.3 定时邮件:不会忘事的电子秘书

@Scheduled(cron = "0 0 9 ? * MON") // 每周一早上9点
public void sendWeeklyReport() {
// 自动给老板发送"表面功夫"周报
}

五、Spring Task的四大超能力

5.1 简单到犯规的配置

@Scheduled(fixedDelay = 5000) // 5秒后重复
@Scheduled(fixedRate = 3000) // 3秒一次
@Scheduled(initialDelay = 10000, fixedRate = 5000) // 10秒后开始,每5秒一次

5.2 线程池调优指南

@Configuration
public class TaskConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 创建10个线程的定时任务线程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}

5.3 分布式环境生存指南

当多个实例同时运行时:

  • 使用Redis分布式锁
  • 数据库乐观锁控制
  • 借助Zookeeper选举主节点

六、避坑指南:定时任务界的黑暗森林

6.1 单线程陷阱

默认单线程执行时,前一个任务卡住会导致后续任务排队。解决方案:

@EnableAsync // 开启异步模式
@Async // 给方法加上"加速器"
@Scheduled(fixedRate = 1000)
public void asyncTask() {
// 现在不会堵车了
}

6.2 时间漂移问题

使用fixedDelay代替fixedRate:

@Scheduled(fixedDelay = 5000) // 每次执行结束后等5秒

6.3 Cron表达式常见翻车现场

  • 0 */5 * * * ? 每5分钟(整点开始)
  • 0 5/10 * * * ? 每小时的第5分钟开始,每10分钟一次
  • 0 0 12 1W * ? 每月最接近1号的工作日中午12点

七、性能优化:让定时任务飞起来

7.1 任务执行时间监控

@Around("@annotation(scheduled)")
public Object monitor(ProceedingJoinPoint pjp, Scheduled scheduled) throws Throwable {
long start = System.currentTimeMillis();
try {
return pjp.proceed();
} finally {
long cost = System.currentTimeMillis() - start;
log.info("任务执行耗时:{}ms", cost);
}
}

7.2 任务开关控制

# application.properties
schedule.enabled=true
@ConditionalOnProperty(name = "schedule.enabled", havingValue = "true")
@Scheduled(cron = "${schedule.cron}")
public void configurableTask() {
// 可配置的任务
}

八、未来展望:定时任务的星辰大海

  • 动态任务管理: 运行时修改cron表达式
  • 任务可视化监控: 接入Admin监控面板
  • 弹性调度策略: 根据系统负载自动调整
  • 分布式协调: 整合Quartz集群方案
// 动态任务示例
@Autowired
private ScheduledTaskRegistrar taskRegistrar;

public void addDynamicTask(Runnable task, String cron) {
taskRegistrar.addCronTask(new CronTask(task, cron));
}

最后友情提醒:

定时任务虽好,但不要贪杯哦!

当你的任务开始需要以下功能时,就该考虑专业调度框架了:

  • ✅ 任务持久化
  • ✅ 失败重试机制
  • ✅ 可视化任务管理
  • ✅ 复杂依赖关系

现在就去给你的程序装上”定时芯片”吧!如果遇到任何问题,欢迎在评论区呼叫”任务救援队”~

文章目录
  1. 1. 一、Spring Task是什么?程序员的”私人助理”
  2. 2. 二、3步打造你的时间管理大师
    1. 2.1. 2.1 添加”机械心脏”(依赖注入)
    2. 2.2. 2.2 启动”定时芯片”(启用注解)
    3. 2.3. 2.3 编写”日程表”(定时方法)
  3. 3. 三、Cron表达式:时间管理的摩斯密码
    1. 3.1. 3.1 7位密码解析器
    2. 3.2. 3.2 常用组合姿势
    3. 3.3. 3.3 特殊符号说明书
  4. 4. 四、六大应用场景:解放生产力的秘密武器
    1. 4.1. 4.1 数据同步:系统间的”快递小哥”
    2. 4.2. 4.2 日志清理:数字世界的扫地机器人
    3. 4.3. 4.3 定时邮件:不会忘事的电子秘书
  5. 5. 五、Spring Task的四大超能力
    1. 5.1. 5.1 简单到犯规的配置
    2. 5.2. 5.2 线程池调优指南
    3. 5.3. 5.3 分布式环境生存指南
  6. 6. 六、避坑指南:定时任务界的黑暗森林
    1. 6.1. 6.1 单线程陷阱
    2. 6.2. 6.2 时间漂移问题
    3. 6.3. 6.3 Cron表达式常见翻车现场
  7. 7. 七、性能优化:让定时任务飞起来
    1. 7.1. 7.1 任务执行时间监控
    2. 7.2. 7.2 任务开关控制
  8. 8. 八、未来展望:定时任务的星辰大海
    1. 8.1. 最后友情提醒: