我正在尝试使用 Java Quartz 计算 cronExpression 的下一个执行时间,但
nextFireTime
属性总是为 null。
Cron 表达式似乎有效。我正在使用 2.3.2 版本
org.quartz-scheduler
我做错了什么?
public LocalDateTime cronExpression(String cronExpression, LocalDateTime startDate) {
try {
CronExpression cron = new CronExpression(cronExpression);
CronTrigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
.startAt(Date.from(startDate.atZone(ZoneId.systemDefault()).toInstant())).
build();
Date nextExecutionTime = trigger.getNextFireTime();
return nextExecutionTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
} catch (ParseException e) {
LOGGER.debug("Error parsing cron expression {}", e.getMessage());
} catch (Exception e) {
LOGGER.debug("Unexpected error {}", e.getMessage());
}
return null;
}
@Test
void test() throws ParseException {
String cronExpression = "0 0 10 1/1 * ? *";
LocalDateTime startDate = LocalDateTime.of(2024, 4, 1, 15, 0);
LocalDateTime nextExecutionTime = jobSchedulingService.calculateNextExecutionTime(cronExpression, startDate);
assertNotNull(nextExecutionTime);
assertEquals(startDate.plusHours(1), nextExecutionTime);
}
由于您尚未使用 Quartz 调度程序安排作业详细信息和触发器,因此当在
null
上调用 getNextFireTime()
时,它始终会返回一个 trigger
值。
如果您只是想通过提供 cron 表达式和日期来获取下一次触发时间,您可以在
getNextValidTimeAfter()
中使用 CronExpression
。但是,这不会考虑您可能在触发器本身和作业的当前状态上配置的任何失火指令。
示例:
LocalDateTime startDate = LocalDateTime.of(2024, 4, 1, 15, 0);
// Cron expression: 10AM every day
CronExpression cron = new CronExpression(0 0 10 1/1 * ? *);
// Result = 2024-04-02T10:00
Date nextDate = cron.getNextValidTimeAfter(Date.from(startDate.atZone(ZoneId.systemDefault()).toInstant()));