1

Quartz Scheduler に問題があります。ここで実用的にするために、単体テストのコードを見つけます。

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.getListenerManager().addSchedulerListener(schedulerTestListener); 

    Trigger trigger = newTrigger()
            .withIdentity(CoreTestConstants.TEST_TRIGGER, CoreTestConstants.TEST_TRIGGER_GROUP)
            .withSchedule(simpleSchedule()
                    .withMisfireHandlingInstructionIgnoreMisfires()
                    .withIntervalInMilliseconds(1000)
                    .repeatForever())
            .forJob(CoreTestConstants.TEST_JOB, CoreTestConstants.TEST_JOB_GROUP)
            .build(); 


scheduler.scheduleJob(getJobDetail(), trigger);

Thread.sleep(20000L);

scheduler.start();

問題は、scheduler.scheduleJob(...) が実行されると、タスクがすぐに開始されないことを認識しますが、scheduler.start() が実行されると、20 個のタスクがすぐに実行されていることがわかります。

つまり、通常は、 scheduler.start() が実行されるまで、タスクを記録したり開始したりしないでください。しかし、どういうわけか、クォーツシステムは scheduler.start() が実行されない前でもタスクの状態を保持し、その後 scheduler.start() が呼び出されると、不足しているタスクの実行がすぐにトリガーされます。

ここにログ:

09:32:45,005  INFO StdSchedulerFactory:1310 - Quartz scheduler version: 2.1.5
09:32:51,013  INFO SchedulerTest:47 - [test] Scheduler starting..
09:32:51,014  INFO QuartzScheduler:534 - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 1 / 1349850771037
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 2 / 1349850771040
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 3 / 1349850771040
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 4 / 1349850771041
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 5 / 1349850771042
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 6 / 1349850771043
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 7 / 1349850771044

トリガーを 1 秒間隔で実行するように設定しても、スレッドのスリープ中に不足しているタスクが実行されていることがわかります。

失火命令をいじってみましたが、意味がありません。私の場合、コードの動作は変わりません。

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

0

問題は、Thread.sleep(20000L);実際に待機中にジョブがトリガーされてスケジュールされることです。したがって、startが起動されると、スケジュールされたすべてのジョブが開始されます。Thread.sleepをにTrigger trigger設定すると、待機後にトリガーとスケジュールが開始されます。失火ポリシーを見てください

于 2012-10-10T07:52:18.110 に答える