1

年の値を含む 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 式に何か不足していますか?

4

1 に答える 1

5

cron 式の月は 1 ベースです。が実行されないのはそのため0 37 17 * 4 ? 2012です。今日は 5 月 10 日で、4 月の毎日実行したいとします。年を削除すると、次の予定日は 2013 年に出力されますが、4 月です! myJobKey は、Mon Apr 01 18:16:00 EDT 2013に実行されます。

明らかに、式は次のようになります。

0 37 17 * 5 ? 2012

または将来の混乱を避けるために:

0 37 17 * May ? 2012
于 2012-05-10T21:25:01.710 に答える