Spring Boot Scheduler如何配置实现周六周日暂停定时任务
你可以根据自己的场景选下面两种常用实现方案,都是生产环境验证过的:
方案1:直接调整Cron表达式(最推荐,零业务侵入)
Spring @Scheduled 用的是6位Cron表达式,字段顺序固定为 秒 分 时 日 月 周,其中周字段的取值规则:
- 0或7 代表周日
- 1 代表周一
- 2 代表周二
- 3 代表周三
- 4 代表周四
- 5 代表周五
- 6 代表周六
你要实现周六、周日不触发任务,只需要把原表达式里代表「全周匹配」的周位*改成1-5(仅周一到周五匹配)即可,完全不需要改业务代码。
配置修改示例
在你的配置文件里把cron值改成下面这样即可,顺便修正了原表达式秒位写*导致的单分钟重复触发问题(原写法会在每10分钟的第0分钟内每秒触发一次任务,秒位写0代表整10分钟点触发一次):
job.schedule.task.notifyServiceProvider=0 */10 * * * 1-5
注解部分不需要额外改动,保持原有配置读取逻辑就行:
@Scheduled(cron = "${job.schedule.task.notifyServiceProvider:0 */10 * * * 1-5}") @SchedulerLock(name = "notifyServiceProvider()") @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) public void notifyServiceProvider() { // 原有业务逻辑 }
方案2:方法内增加日期判断(适合复杂过滤规则)
如果你后续还需要扩展跳过法定节假日、特殊运维停用日这类Cron不好实现的复杂规则,可以直接在业务方法开头加日期判断,周末直接返回不执行后续逻辑:
@Scheduled(cron = "${job.schedule.task.notifyServiceProvider:0 */10 * * * *}") @SchedulerLock(name = "notifyServiceProvider()") @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) public void notifyServiceProvider() { // 周末直接跳过 DayOfWeek currentDay = LocalDate.now().getDayOfWeek(); if (currentDay == DayOfWeek.SATURDAY || currentDay == DayOfWeek.SUNDAY) { return; } // 原有业务逻辑 }
这个方案直接用JDK8+自带的java.time日期API实现,不需要引入任何第三方依赖,后续扩展规则也很方便。
注意:你已经加了
@SchedulerLock分布式锁,不管选哪种方案,多实例部署下都不会出现任务重复执行的问题,不需要额外做并发处理。
内容的提问来源于stack exchange,提问作者Ranjithkumar
相关产品推荐
相关产品推荐

