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

Spring Boot @Scheduled如何用单个Cron表达式实现准点起止的定时任务?

解决方案:单个Cron表达式实现需求

你可以通过在单个Cron表达式中用逗号分隔多个调度规则来实现需求,Spring Boot的@Scheduled注解支持这种写法。具体表达式如下:

0 */15 8-16 * * MON-FRI, 0 0 17 * * MON-FRI

表达式解析

  • 前半部分0 */15 8-16 * * MON-FRI:工作日8:00到16:45之间,每15分钟执行一次(覆盖8:00、8:15、...、16:45所有时间点)。
  • 后半部分0 0 17 * * MON-FRI:工作日17:00准点执行一次。
  • 逗号分隔后,Spring会同时解析这两个规则,既包含所有15分钟间隔的任务,也会触发17:00的那次执行,且不会触发17:15及之后的任务。

配置到application.properties

你可以把这个表达式配置在配置文件中,实现集中管理:

my.task.cron=0 */15 8-16 * * MON-FRI, 0 0 17 * * MON-FRI

然后在代码中引用:

@Scheduled(cron = "${my.task.cron}")
public void runScheduledTask() {
    // 你的任务逻辑
}
其他优雅方案(如果不想用多规则Cron)

如果对多规则Cron的写法有顾虑,还有两种相对简洁的方式:

  • 保留两个@Scheduled方法:你当前的实现其实已经很清晰,一个方法负责周期调度,另一个仅触发17:00的执行并调用前者,这种方式可读性强,维护成本低,完全不需要过度优化。
  • 使用Cron表达式+轻量时间校验:用0 */15 8-17 * * MON-FRI作为基础调度,然后在任务开头添加一行时间校验:
    LocalTime now = LocalTime.now();
    if (now.isAfter(LocalTime.of(17, 0))) {
        return;
    }
    
    这种方式仅在17:15及之后的触发时直接返回,不会执行任务逻辑,对17:00的执行没有影响,因为此时now等于17:00,不会触发返回。

内容的提问来源于stack exchange,提问作者Wintermute

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:40:15