我在使用 Quartz 调度程序时遇到问题。为了实用,您可以在这里找到我的单元测试代码:
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 秒为间隔执行,它也会在线程睡眠期间执行丢失的任务。
我试图玩弄失火指令,但这没有意义,在我的情况下它不会改变代码的行为。
任何帮助,将不胜感激。提前致谢。