Spring 调度 - 每天午夜的 Cron 表达式不起作用?

Spring Scheduling - Cron expression for everyday at midnight not working?

我正在尝试在 Spring 中安排一项任务,即每天 运行 午夜。我遵循了 Spring 中的 official guide 并制作了调度程序 class 如下:

@Component
public class OverduePaymentScheduler {    
    @Scheduled(cron = "0 0 0 * * *")
    public void trackOverduePayments() {
        System.out.println("Scheduled task running");
    }
}

但是,当时钟指向凌晨 12 点时,任务不会 运行。我从 link.

的石英调度程序文档中获得了 cron 表达式

如果我将 cron 表达式更改为“*/10 * * * * *”,即每 10 秒 运行 秒,调度程序将正常执行。

那我做错了什么?

请在每天 12:00 上午使用以下 cron 模式:

    // at 12:00 AM every day
    @Scheduled(cron="0 0 0 * * ?")

我已经在这个网站上检查了你的 cron 模式:http://www.cronmaker.com/

它说模式 0 0 0 * * * 无效。

这些是 cron 表达式的有效格式:

  • 0 0 * * * * = 每天每个小时的顶部。
  • */10 * * * * * = 每十秒一次。
  • 0 0 8-10 * * * = 每天8点、9点、10点。
  • 0 0 6,19 * * * = 6:00 AM 和 7:00 PM 每天。
  • 0 0/30 8-10 * * * = 8:00、8:30、9:00、9:30、10:00 和 10:30 每个 天.
  • 0 0 9-17 * * MON-FRI = 工作日朝九晚五整点
  • 0 0 0 25 12 ? = 每个圣诞节午夜

模式是:

second, minute, hour, day, month, weekday

所以你的答案是:

0 0 0 * * *

我终于让它与这个 cron 表达式一起工作 0 0 0 * * * 但我必须像这样在调度程序 class 中设置时区。 @Scheduled(cron = "0 0 0 * * *",zone = "Indian/Maldives")

您可以使用以下格式来满足您的要求:

0 0 23 * * *

因为 Quartz 配置的小时从 0 到 23。 您可以参考此 link 了解更多信息。

对于spring 5.3 或以上的用户,我们有更简单的方法来定义 crons

Macro Meaning
@yearly (or @annually) once a year (0 0 0 1 1 *)
@monthly once a month (0 0 0 1 * *)
@weekly once a week (0 0 0 * * 0)
@daily (or @midnight) once a day (0 0 0 * * *)
@hourly once an hour, (0 0 * * * *)

参考:https://spring.io/blog/2020/11/10/new-in-spring-5-3-improved-cron-expressions