2010-12-20 18 views
0

問候,您的友好鄰居Quartz.NET n00b又回來了!Quartz.NET:需要在iStatefulJob實例上的CronTrigger *延遲而不是跳過*如果在計劃成熟時運行作業

我有一個Windows服務在基於Quartz.NET CronTrigger調度方案運行iStatefulJob情況下... cron的字符串用於安排工作: 「0 0/1 * * * *?」

一切正常大。但是,如果我有一份要運行的工作,比如說,在每分鐘的X:00標記處,並且該工作恰好運行了一分多鐘,我注意到後續作業在作業完成後立即運行執行,而不是等到下一次計劃運行時,纔有效地「排隊」,而不是僅僅跳過作業,直到下一次計劃運行。

我在觸發器中放入了一個CronTrigger的錯誤指令,但是當一項工作超出其下一個計劃執行計劃時,會發生完全相同的事情。

如何讓iStatefulJob實例僅在當前正在運行的情況下跳過計劃的執行觸發器,而不是在第一次執行完成之前將其延遲?

我明確設置了trigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;

但是......而不是「什麼都不做」,爲計劃爲每分鐘運行是需要90秒就可以完成工作,我遇到以下執行日誌:

  • 工作在9:00運行: 00am,在上午9:01:30完成< - 作業運行時間爲1:30
  • 作業在9:01:30上午完成,在上午9:03:00完成< - 後續作業應該在9:01:00運行
  • 工作在早上9:04:00運行,在上午9:05:30完成< - 不應該這個運行在9:03:00?
  • 作業在上午9:05:30完成,在上午9:07:00完成< - 應該在9:05:00運行的後續作業
  • 作業在9:08:00上午完成,在9:09完成:上午30點< - 不應該在9:07:00運行嗎?

......它似乎像第一次正確運行,在一分鐘......延遲30秒,因爲90秒的工作執行時間到期,然後,而不是等到下一個整分鐘,立即執行30秒標記...雙奇數,是它然後在分鐘刻度上完成第二項工作,但等待直到NEXT分鐘標記執行而不是運行它回2回...

看起來好像它可以正常工作每一個其他的運行,當它沒有運行在:30分...

什麼是最好的方式讓工作不要延遲/隊列,而只是跳過,直到它閒下一個時間表會成熟嗎?

編輯:我試着回到iJobs而不是iStatefulJobs使用相同的DONOTHING觸發器失火指令,但作業執行每分鐘儘管事先執行仍然活動。我似乎無法讓它跳過預定的運行,如果它正在運行iJob或iStatefulJob ...

編輯#2:我認爲我的觸發從來沒有失誤,這就是爲什麼DoNothing作爲失火指令是沒用的...鑑於這種情況,我想我需要另一種機制來檢測計劃的作業實例是否正在運行,以確保作業在下一次執行之前跳到其下一個執行時間,而不是延遲到第一次執行完成爲止......

編輯3:我嘗試添加一個元素到iStatefulJob jobdatamap,名爲「IsRunning」...我在執行序列開始時將其設置爲TRUE,然後在作業完成後將其返回爲false。在執行之前,它會檢查顯然在作業之間持續存在的元素,並且如果它檢測到它爲真,則會過早退出執行過程(記錄「JOB SKIPED!」)。這可能不起作用,原因可能很明顯:如果這些工作是按照上面的時間表進行的,那麼這個工作永遠不會與其自身一起運行,因爲它會拖延運行直到工作結束,所以這個檢查是無用的。根據文檔,從iStatefulJob返回iJob在這裏沒有幫助,因爲jobdatamap只在Stateful作業類型的作業之間持續存在...

我仍然沒有解決如何跳過預定的作業,而不是延遲它直到這是當前迭代完成...如果有人有想法,你是一個救星! :)

回答

2

它應該由RAMJobStore的失火閾值(http://quartznet.sourceforge.net/apidoc/topic2722.html)引起。

的時間跨度由觸發器必須 已經錯過了下火的時候,在 以便它被視爲 「發揮失常」,從而具有應用其失火 指令。

默認爲60秒。所以工作不會被視爲「失誤」,直到遲到超過失誤閾值爲止。

要解決的問題,只是降低這個門檻(下面的代碼設置爲1毫秒):

... 
properties["quartz.jobStore.misfireThreshold"] = "1"; 
... 
schedulerFactory = new StdSchedulerFactory(properties); 

應該解決的問題。

相關問題