SpringBoot + 定时任务重叠执行防护:上一轮未结束,下一轮已开始?自动跳过。
一、定时任务重叠执行的痛点 上周,一位做电商系统的朋友向我求助:他们的库存同步任务出现了数据错乱的问题。 "我们的库存同步任务每5分钟执行一次,"朋友焦急地说,"但有时候任务执行时间超过5分钟,导致上一轮还没结束,下一轮就开始了,结果库存数据被重复处理,出现了负数。" 我查看了他们的代码,发现问题确实很严重: 使用 @Scheduled 注解实现定时任务 任务执行时间不确定,有时超过定时周期 没有任何防重叠措施 并发执行导致数据竞争和不一致 任务堆积导致系统负载飙升 更关键的是,他们根本不知道有多少次任务发生了重叠,也没有任何监控和告警机制。 二、传统方案的局限性 1. 增加定时周期 通过延长定时周期来避免任务重叠。 @Scheduled(cron = "0 */10 * * * ?") // 从5分钟改为10分钟 public void syncInventory() { // 库存同步逻辑 } 这种方案的问题: 业务延迟:任务执行间隔变长,可能影响业务时效性 治标不治本:如果任务执行时间超过新的周期,仍然会重叠 资源浪费:当任务执行时间很短时,会有大量空闲时间 不够灵活:无....