将cronTrigger与包含年份值的表达式一起使用时出错

Mar*_*ina 1 java cron quartz-scheduler crontrigger

我正在观察一个奇怪的行为,该行为使用包含年份值的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);
Run Code Online (Sandbox Code Playgroud)

然后在我的单元测试中,确定“现在”日期,向其添加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
Run Code Online (Sandbox Code Playgroud)

但是,当尝试使用此cron表达式计划作业时,出现以下错误:

org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
Run Code Online (Sandbox Code Playgroud)

如您所见,该日期是相对于我运行测试的日期/时间而言的将来...因此,尝试安排作业在过去的某个时间运行应该不是问题。

现在,下一个奇怪的事情是:请注意,我确实在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
Run Code Online (Sandbox Code Playgroud)

我在这些cron表达式中缺少什么吗?

Tom*_*icz 5

cron表达式中的月份从1开始。这就是为什么0 37 17 * 4 ? 2012从来没有执行过的原因:今天是5月10日,您希望它在4月的每一天运行。当您删除年份时,它将在2013年打印下一个计划的日期,但在4月!myJobKey的运行时间为:美国东部夏令时间2013年4月 1日星期一18:16:00

显然,您的表达应为:

0 37 17 * 5 ? 2012
Run Code Online (Sandbox Code Playgroud)

或避免将来造成混淆:

0 37 17 * May ? 2012
Run Code Online (Sandbox Code Playgroud)