年の値を含む 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 年であることを示しています! (1年後....-そしてもちろん、それが解雇されたことを確認するのにそれほど長く待つことはできません...):
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 式に何か不足していますか?