You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:21:28