Spring Boot cron表达式0的含义 *****

wlp8pajw  于 2022-12-12  发布在  Spring
关注(0)|答案(2)|浏览(252)

我想知道这个表达式在

0 * * * * *

我想这意味着调度程序预计每秒钟都会运行。有人能证实我这一点吗?

@Scheduled(cron = "0 * * * * *")
pod7payv

pod7payv1#

更精确地说,你可以使用CronSequenceGenerator来验证cron表达式的执行时间,Spring内部使用这个对象来计算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);
        }
}

所以,如果我输入:

printNextTriggerTime("0 * * * * *", LocalDateTime.of(2019, 8, 20, 15, 30, 0));

它将输出:

Tue Aug 20 15:31:00 HKT 2019
Tue Aug 20 15:32:00 HKT 2019
Tue Aug 20 15:33:00 HKT 2019
Tue Aug 20 15:34:00 HKT 2019
Tue Aug 20 15:35:00 HKT 2019
Tue Aug 20 15:36:00 HKT 2019
Tue Aug 20 15:37:00 HKT 2019
Tue Aug 20 15:38:00 HKT 2019
Tue Aug 20 15:39:00 HKT 2019
Tue Aug 20 15:40:00 HKT 2019

这意味着0 * * * * *将每分钟运行一次,而不是每秒钟运行一次。

goucqfw6

goucqfw62#

answer by Ken Chan的更新考虑到了Spring中不赞成使用CronSequenceGenerator而支持CronExpression

public static void printNextTime(String cronString) {
        CronExpression exp = CronExpression.parse(cronString);
        Stream.iterate(now(), exp::next).limit(10).forEach(System.out::println);
    }

调用printNextTime("0 * * * * *");生成:

2022-12-12T08:56:38.442809
2022-12-12T08:57
2022-12-12T08:58
2022-12-12T08:59
2022-12-12T09:00
2022-12-12T09:01
2022-12-12T09:02
2022-12-12T09:03
2022-12-12T09:04
2022-12-12T09:05

相关问题