即使设置了失火指令,Quartz Scheduler也会运行丢失的触发器



我在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(…)执行时,我意识到任务没有立即启动,但当schedules.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秒为间隔执行,它也会在线程睡眠期间执行丢失的任务。

我试着绕过失火指令,但这没有意义,在我的情况下,它不会改变代码的行为。

如有任何帮助,我们将不胜感激。提前谢谢。

好吧,您的问题是Thread.sleep(20000L);在等待时,实际上作业是被触发和调度的,因此当启动被触发时,所有调度的作业都在启动,您可以将Thread.sleep设置为Trigger trigger,以便它在等待后开始触发和调度。查看失火策略

最新更新