2010-05-13 30 views
9

我有一個已經安排好的石英作業。我想更新與之關聯的JobDataMap。如果我得到一個帶有JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap()的JobDataMap,那個地圖是否是「活的」?即。如果我改變它,它會在調度程序中持久嗎?如果不是,我該如何堅持下去?更新現有的JobDataMap

回答

6

參見http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03.html

作業實例可以被定義爲 「有狀態」 或 「非狀態」。 非狀態作業只有在 被添加到調度程序時,它們的JobDataMap纔會存儲它們的 。這意味着 任務在執行 期間對作業數據映射的內容 所做的任何更改都將丟失,並且在下次執行 時不會執行 。

...一個有狀態的工作正好相反 - 它的JobDataMap被重新存儲在 之後,每執行一次工作。

通過讓Job實現StatefulJob 接口而不是Job 接口,將「作業」標記爲有狀態。

+1

但是如果我想從執行之外更新作業呢?例如來自JMX? – 2013-02-07 15:12:26

12

我有一個類似的問題:我有第二個觸發器觸發作業的數據映射隊列中的狀態作業。每次作業激發時,它都會從隊列中輪詢並對輪詢的元素執行一些工作。每執行一次作業,隊列中的一個元素就會減少(隊列從作業中正確更新)。當隊列爲空時,該作業將自行排除。

我希望能夠在外部更新正在進行的作業/觸發器的參數列表,以向隊列提供更多參數。但是,僅檢索數據映射並更新隊列是不夠的(以下執行顯示隊列未更新)。問題在於Quartz只會在執行後更新作業實例的作業數據映射。

這是我找到了解決辦法:

JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup"); 
jobDetail.getJobDataMap.put("jobQueue", updatedQueue); 
scheduler.addJob(jobDetail, true); 

最後一行指示Quartz來替換你提供一個存儲作業。下一次作業被解僱時,將會看到更新的隊列。

+0

使用最新版本的Quartz(2.6.10?) – 2013-03-13 01:24:35

+0

似乎存在一個問題對不起 - 這是版本2.1.7 ...以前工作良好2.1.6以前 – 2013-03-13 20:31:51

24

在石英2.0。 StatefulJob已棄用。爲了保留作業數據圖,請在作業類上使用@PersistJobDataAfterExecution。它通常與@DisallowConcurrentExecution一起使用。

+0

感謝您的信息Bozho。 – 2012-07-12 06:54:20

+0

但是在哪個表中我們可以找到JobDataMap信息,我檢查了所有的表格,但是我找不到它們。 – 2012-07-12 06:55:59

+0

它是QRTZ_JOB_DETAILS表的Job_data列嗎? – 2012-07-12 07:08:32