2010-10-09 60 views
8

我有一個計劃的作業有每5分鐘重複間隔。它工作正常。如何使Quartz.NET進程同步?

但我在我的第一份工作是不是在5分鐘完成和第二份工作開始(因爲它定於5分鐘)的情況。

我不想這樣做,只有一個工作應該在同一時間內工作。我怎樣才能做到這一點?

這是我的代碼:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
IScheduler sched = schedFact.GetScheduler(); 
Trigger emailTrigger = TriggerUtils.MakeMinutelyTrigger(5); 
emailTrigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); 
emailTrigger.Name = "EmailTrigger"; 
JobDetail emailJobDetail = new JobDetail("EmailJob", null, typeof(EmailJob)); 
sched.ScheduleJob(emailJobDetail, emailTrigger); 
sched.Start(); 

回答

1

我用Quartz.net了一點,但從來沒有調查執行工作之間的串行處理。根據我的經驗,Quartz更多用於「並行」預定處理,如果作業可能會長時間重疊,所以我不確定它是否支持您需要的處理。

一個簡單的解決問題的方法可能是使用可以被任何工作線程(如鎖,互斥,信號量或全局布爾等)的訪問同步變量。當一個新工作啓動時,它應該檢查鎖,如果它是空閒的,抓住它並且保持它直到它完成。如果另一個工作醒來,並且看到之前的工作仍在運行,則新工作可以退出,並等待調度員在下一個時間間隔再次嘗試。你也可以有新的工作等待之前完成,但如果你這樣做,你運行的作業堆積如山等待執行的風險,並且該系統從未「惡補」。

+0

它甚至不需要等待;它可以試着抓住同步機制。如果失敗了,那麼這份工作應該返回它完成並完成。如果它確實抓住它,那麼它應該處理。沒有「追趕」。當然,它跳過的事實應該被記錄下來,並且應該在那個時候重新評估它的時間表。 – casperOne 2011-11-17 13:10:16

30

Quartz.NET 2.x的

實施IJob並與[DisallowConcurrentExecution]屬性裝飾你的作業類。有關更多信息,請閱讀DisallowConcurrentExecutionAttribute的API文檔。

Quartz.NET 1.x的

使工作類實現IStatefulJob而非IJob。有關更多信息,請閱讀IStatefulJob的API文檔。

http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire

+7

還是在Quartz.net 2.0,實現IJob並與'DisallowConcurrentExecution'屬性 – Cocowalla 2012-07-14 18:54:32

+0

謝謝,我已經更新了答案 – 2014-01-30 06:16:41

+0

@ neo的裝點,請更新正確的答案。 – regisbsb 2015-07-16 09:35:43