2014-03-05 112 views
0

進出口使用石英春天通過JDBC工作存儲庫的支持,和IM在試圖使其觸發一個作業「現在」:如何減少石英調度延遲

Trigger adHocTrigger = TriggerBuilder.newTrigger().withIdentity(adHocTriggerKey).forJob(jobKey).startNow().build(); 
quartzScheduler.scheduleJob(adHocTrigger); //now 

此調用和時間之間的測量延遲作業實際開始執行的時間默認爲30秒。這裏有一個例子工作來衡量,我用一個關閉觸發延遲:

@Override 
public void execute(JobExecutionContext context) throws JobExecutionException { 
    Trigger trigger = context.getTrigger(); 
    if (!trigger.mayFireAgain()) { 
     //its a one-off, compute latency 
     long latency = System.currentTimeMillis() - trigger.getFinalFireTime().getTime(); 
     logger.info("firing latency is {} millis",latency); 
    } 
} 

閱讀the documentation後,我發現對於延遲的原因是「org.quartz.scheduler.idleWaitTime」配置參數(基本任務存儲器輪詢頻率?),它可以配置爲低至1000毫秒(此時,所獲得的等待時間大約爲900毫秒)。

據我所知,將其設置爲低可能會導致數據庫抖動(即使用jdbc作業存儲),因此不推薦使用,但有什麼方法可以實現低延遲而不訴諸於此?

是否有沒有可選的配置屬性,會導致「現在火」實際上做?

+0

爲什麼不只是調用這個工作,而是委託Quartz? –

+0

@PabloLozano - 因爲它可能是一個長期的工作,並觸發它的代碼是ui-backed,不能延遲。也因爲工作是一個單身人士工作(@ DisallowConcurrentExecution)由多個觸發器觸發,一些重複,我不想實現鎖定自己 – radai

+0

@radai - 你有任何解決方案? –

回答

0

文檔說'triggerJob'會立即啓動作業。檢查這是否符合您的要求。

quartzScheduler.triggerJob(jobKey); 
+0

我試過這個。它使我得到了與上述相同的結果。 「立即」實際上意味着「下次調度員投票工作」 – radai