Как получить Java Duration из выражения cron? - PullRequest
1 голос
/ 12 апреля 2020

У меня есть запланированное задание в приложении весенней загрузки:

@Scheduled(fixedRateString = "${scheduled.task.rate}")
public void runScheduledTask() {
    // ...
}

С соответствующим тестом:

@Test
public void test_scheduledTask_runs() {
    await().atMost(Duration.ofMillis(scheduledTaskRate).multipliedBy(2)).untilAsserted(() -> {
        Mockito.verify(scheduledTasks, Mockito.atLeastOnce()).runScheduledTask();
    });
}

Теперь я хочу использовать крон вместо фиксированной скорости:

@Scheduled(cron = "${scheduled.task.cron}")

Теперь мне нужно адаптировать тест к этому. Как получить Duration объект, соответствующий частоте выражения cron?

1 Ответ

2 голосов
/ 12 апреля 2020

Spring специфицирует c решение:

Spring предоставляет CronSequenceGenerator, который можно использовать для анализа выражения cron и получения next Date экземпляр, в котором он будет запущен после предоставленного Date.

Таким образом, чтобы получить Duration:

CronSequenceGenerator generator = new CronSequenceGenerator(scheduledTaskCron);
Date nextExecution = generator.next(new Date());
Date nextToNextExecution = generator.next(nextExecution);
Duration durationBetweenExecutions = Duration.between(
        nextExecution.toInstant(), nextToNextExecution.toInstant()
);
...