2012-10-10 49 views
0

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(...)被執行我承認,任務沒有立即然而,當開始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秒的時間間隔來執行,它的線程睡眠期間執行的缺失任務。

我試圖玩弄失火指令,但它沒有意義,它不會改變我的情況下的代碼行爲。

任何幫助,將不勝感激。提前致謝。

+0

你可以給石英和彈簧的依賴關係嗎? – sgpalit

+0

石英2.1.5 spring 3.1.0.RELEASE – Javatar

回答

0

確定您的問題與Thread.sleep(20000L);在實際等待作業被觸發和計劃時相同,因此,當啓動被觸發時,所有預定作業都將啓動,您可以將Thread.sleep設置爲Trigger trigger,以便它在等待後開始觸發和調度。 Take a look for misfire policy

+0

我想指出的問題是石英調度的行爲。計劃作業時啓動計時器不是很困難嗎?相反,當我調用scheduler.start()的時候,我的想法是開始調度和觸發。 – Javatar

+1

@Bariscan是的,你說得對,我完全同意你的觀點:)但它不能這樣工作...... TriggerBuilder在作業中設置觸發器並開始計數,scheduleJob執行時quartz根據觸發器創建一個計劃表已經開始),並在等待20秒時觸發器仍在運行並安排作業,然後當您啓動時,所有預定作業開始運行。你可以看一個石英的例子http://quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-02 – sgpalit

相關問題