Spring调度 - 每天午夜的Cron表达式无法工作?

54

我正在尝试使用Spring框架安排一个每天午夜都会运行的任务。我按照Spring官方指南中的说明(链接),编写了以下调度程序类:

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

然而,当时钟指向凌晨12点时,任务不会运行。我从Quartz Scheduler的文档中获得了cron表达式,该文档链接在这里link

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

那么我做错了什么?


2
如果您使用的是Spring 5.3.3或更高版本,请尝试使用@Scheduled(cron = "@midnight")。 Cron表达式可能很难阅读。 - Anshul
5个回答

121

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

  • 0 0 * * * * = 每天每小时整点。
  • */10 * * * * * = 每十秒一次。
  • 0 0 8-10 * * * = 每天8点、9点和10点。
  • 0 0 6,19 * * * = 每天上午6点和晚上7点。
  • 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 * * *

遇到了无效的@Scheduled方法“Cleanup”:范围超过最大值(24):“0 0 24 * *”。我们不能使用24。 - Mohit marwal
4
每天午夜执行的定时任务:User 0 0 0 * * * - CodeShadow
1
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html - Taras Melnyk

44

我终于通过这个cron表达式 0 0 0 * * * 让它工作了,但是我必须像这样在调度器类中设置时区。 @Scheduled(cron = "0 0 0 * * *",zone = "Indian/Maldives")


21
请使用以下cron模式来表示每天上午12:00:
    // at 12:00 AM every day
    @Scheduled(cron="0 0 0 * * ?")

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

它显示模式 0 0 0 * * *为无效。


我尝试了这个,但它没有起作用。虽然我很感激你的帮助。 - Charlie
我在我的项目中使用了这个cron模式。它运行良好...我刚刚测试过,通过更改我的系统时钟时间为晚上11:59,调度程序会在凌晨12:00自动触发。 - Ajit Soman
15
很遗憾,cronmaker不兼容Spring的cron表达式。 - jon martin solaas
这对我不起作用,Spring Boot 版本为 2.1.0.RELEASE。 - AshishUpadhyay
@AshishUpadhyay 你遇到了什么异常? - Ajit Soman
没有异常,只是在不设置时区的情况下,0 0 0 * * * 运行得非常好。 - AshishUpadhyay

5
对于使用spring 5.3或以上版本的用户,我们有一种更简单的方法来定义cron表达式。
宏表:
@yearly (或 @annually):每年一次 (0 0 0 1 1 *)
@monthly:每月一次 (0 0 0 1 * *)
@weekly:每周一次 (0 0 0 * * 0)
@daily (或 @midnight):每天一次 (0 0 0 * * *)
@hourly:每小时一次 (0 0 * * * *)

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


使用 SpringVersion.getVersion() 获取当前 Spring 版本。 - logbasex

3
你可以使用以下格式来满足你的要求: 0 0 23 * * * 由于Quartz配置中小时从0到23开始计算。 你可以参考这个链接获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接