Spring Scheduler每周一1点执行的Cron表达式及fixedDelay可行性咨询
Spring Scheduler 每周一凌晨1点任务的实现方案
嗨,针对你的问题,我来详细解答:
对应的Cron表达式
要实现每周一凌晨1点执行的任务,正确的Cron表达式是:
0 0 1 ? * MON
我来拆解一下每个字段的含义(Cron表达式的顺序是:秒 分 时 日 月 周 年(可选)):
0:秒位,指定整分执行0:分位,指定整时执行1:时位,凌晨1点?:日位,这里用?是因为我们已经指定了周字段(MON),避免日和周字段的冲突(两者不能同时指定具体值)*:月位,每个月都执行MON:周位,表示周一- (年位省略,默认每年都执行)
另外,你也可以用数字2代替MON(Cron里周的数字规则是1=周日,2=周一),不过用英文缩写更直观,推荐优先使用MON。
能否使用fixedDelay实现该需求?
答案是不能,原因如下:
fixedDelay的核心逻辑是:以上一次任务执行结束的时间为起点,延迟指定时长后执行下一次任务。它是基于「间隔时长」的定时,而非「日历时间点」的定时。- 假设你第一次手动触发任务在周一1点,设置
fixedDelay = 7 * 24 * 60 * 60 * 1000(7天),看起来前几次会在周一1点执行,但一旦出现以下情况就会完全偏离预期:- 如果某次任务执行时间过长(比如超过1小时),下一次执行时间就会变成周一2点,之后每次都会越来越晚
- 如果服务器重启,任务会在重启后立刻执行一次,之后的执行时间就彻底脱离了周一1点的固定时间点
如果想实现基于日历时间的定时任务,Spring Scheduler中最可靠的方式就是使用Cron表达式,它就是专门为这类「固定日历时间点」的场景设计的。
内容的提问来源于stack exchange,提问作者user5771310
相关产品推荐
相关产品推荐

