SpringBoot 调度程序表达式每天运行两次

use*_*165 3 cron spring-boot

您好,我正在使用下面的 SpringBoot cron 表达式每天运行我的预定作业两次。应该在上午 10 点和下午 4 点运行

@Scheduled(cron = "0 0 10,16 * * *")
Run Code Online (Sandbox Code Playgroud)

我在下午 3:30 启动了 Springboot 应用程序,它在下午 4 点触发了预定的作业,但第二天上午 10 点它没有触发作业

我上面的 cron 表达式有什么问题吗?请注意,这不是 unix cron 表达式。根据 SpringBoot 文档,它只需要 6 个参数。

Ken*_*han 7

cron 表达式是正确的。应该还有其他问题导致您的 cron 作业无法按预期运行。

在内部,Spring 用于CronSequenceGenerator为 cron 表达式生成下一个触发时间。为了证明你的 cron 表达式配置正确,你可以尝试使用CronSequenceGenerator.

例如,以下函数将简单地打印出 cron 表达式的下 10 个触发时间:

 public static void printNextTriggerTime(String cronExpression, LocalDateTime currentTime) {
        CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression);
        Date d = Date.from(currentTime.atZone(ZoneId.systemDefault()).toInstant());
        for (int i = 0; i < 10; i++) {
            d = generator.next(d);
            System.out.println(d);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我输入你的 cron 表达式和开始时间:

    printNextTriggerTime("0 0 10,16 * * *", LocalDateTime.of(2019, 8, 20, 15, 30, 0));
Run Code Online (Sandbox Code Playgroud)

它将输出:

Tue Aug 20 16:00:00 HKT 2019
Wed Aug 21 10:00:00 HKT 2019
Wed Aug 21 16:00:00 HKT 2019
Thu Aug 22 10:00:00 HKT 2019
Thu Aug 22 16:00:00 HKT 2019
Fri Aug 23 10:00:00 HKT 2019
Fri Aug 23 16:00:00 HKT 2019
Sat Aug 24 10:00:00 HKT 2019
Sat Aug 24 16:00:00 HKT 2019
Sun Aug 25 10:00:00 HKT 2019
Run Code Online (Sandbox Code Playgroud)