我正在观察使用包含年份值的 CronTrigger 在 Quartz 中安排作业的奇怪行为。
以下是我创建触发器并使用它安排作业的方式:
CronTrigger trigger = cronJobTriggerFactory.getObject();
trigger.setName(triggerName);
trigger.setGroup(triggerGroupName);
trigger.setCronExpression(cronSchedule);
trigger.setVolatility(false);
JobDetail job = schedulableJobFactory.getObject();
job.setName(jobName);
job.setGroup(jobGroupName);
job.setVolatility(false);
job.setDurability(true);
Date scheduleTime1 = scheduler.scheduleJob(job, trigger);
logger.info(job.getKey() + " will run at: " + scheduleTime1);
然后在我的单元测试中,我确定“现在”日期,添加 5 分钟,计算这个日期/时间的 cron 表达式,并用这个时间表调用我的主要课程安排一个工作。这是单元测试的输出,显示通过了哪个 cron 表达式:
NotificationSchedulerTest - Today is: 9 May 2012 05:32 PM
NotificationSchedulerTest - 5 min later is: 9 May 2012 05:37 PM
NotificationSchedulerTest - cron schedule is: 0 37 17 * 4 ? 2012
但是,当尝试使用此 cron 表达式安排作业时 - 我收到以下错误:
org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
如您所见,相对于我正在运行测试的日期/时间,该日期是未来的……因此,尝试将作业安排在过去的某个时间运行应该不是问题。
现在下一个奇怪的事情:注意我确实在我的 cron 表达式中指定了年份值:“0 37 17 * 4 ? 2012 ”。
如果我修改 cron 表达式的生成并将年份字段保留为未指定(因为它是可选的):“ 0 37 17 * 4 ?” 然后调度确实成功了,但是,调度程序显示下一次触发作业是在 2013 年!(一年后...... - 当然我不能等待那么久来验证它被解雇......):
NotificationSchedulerTest - Today is: 9 May 2012 06:11 PM
NotificationSchedulerTest - 5 min later is: 9 May 2012 06:16 PM
NotificationSchedulerTest - cron schedule is: 0 16 18 * 4 ?
...
NotificationScheduler - myJobKey will run at: Mon Apr 01 18:16:00 EDT 2013
我在这些 cron 表达式中遗漏了什么吗?