2013-07-18 103 views
3

我正在與Quartz一起工作,並且一直存在與作業相關的問題。石英調度器依賴作業

我們有一個設置,其中A和B是不依賴於海誓山盟,雖然C是:

A和B可以在同一時間運行,但是當A和B都是完整的C只能運行。

有沒有辦法在Quartz中設置這種場景,以便C只會在A和B完成時觸發?

回答

3

不是直接AFAIK,但使用TriggerListener來實現這樣的功能應該不是太難(一個TriggerListener既可以運行開始任務,也可以運行結束任務,並且可以爲單個觸發器或觸發器組設置它們) 。

編輯:甚至有一個特定FAQ Topic這個問題:

當前有沒有「直接」或「免費」的方式來鏈 石英觸發。然而,有很多方法可以在不用 的情況下完成。下面是一對夫婦的輪廓接近:

的一種方法是使用監聽器(即TriggerListener,JobListener或 SchedulerListener),可以發現一個工作/觸發的完成和 然後立即安排新的觸發火災。這種方法可能會涉及到 ,因爲您必須通知聽衆跟隨哪個作業 - 您可能需要擔心此 信息的持續存在。查看聽衆 org.quartz.listeners.JobChainingJobListener,隨Quartz一起發貨 - ,因爲它已經具有一些此功能。

另一種方式是建立自己的JobDataMap內含有火下一個作業的 名稱的作業,併爲作業完成(最後一步 在其execute()方法)有工作安排接下來的工作。有幾個人正在這樣做,並有幸運。大多數基於 (抽象)類是一個Job,它知道如何使用預定義鍵(常量)從JobDataMap中獲取作業名稱和 組,並且 包含用於調度已標識作業的代碼。此抽象Job的 執行execute()委託給抽象模板方法 ,如「doWork()」(其中擴展的Job類的實際工作) ,然後它包含用於安排後續工作的代碼。然後 他們只是做這個類的擴展,包括 工作應該做的工作。 '持久'作業的使用,或重載的addJob(JobDetail,boolean,boolean)方法(在Quartz 2.2中添加)有助於 應用程序同時使用其正確的數據定義所有作業, 尚未創建觸發器來觸發它們(除了一次觸發 解鎖鏈中的第一份工作)。在未來,Quartz將提供一個更簡潔的方式來做到這一點,但在此之前,您將不得不使用上述方法之一,或者認爲 是另一個更適合您的方法。