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

时间:2012-10-10 06:36:43

标签: spring quartz-scheduler 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(...)时,我发现该任务没有立即启动,但是当执行scheduler.start()时,我看到20个任务正在立即执行。 / p>

我的意思是,通常在我看来,在执行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秒为间隔执行,它也会在线程休眠期间执行丢失的任务。

我尝试玩失火说明,但它没有意义,它不会改变我的情况下代码的行为。

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

确定你的问题是Thread.sleep(20000L);,同时实际上是在触发并安排了作业,因此当启动所有预定的作业都开始时,你可以将Thread.sleep放到Trigger trigger以便它会等待后开始触发和调度。 Take a look for misfire policy