Quartz 有狀態的JobDataMap

2021-07-03 04:25:58 字數 1582 閱讀 9219

quartz,每次執行job,job永遠是全新的物件,但是,如果job實現org.quartz.statefuljob介面,而不是job介面.

此時jobdetail的jobdatamap將會共享乙個物件。

注意:當實現有狀態介面,statefuljob時,只有jobdetail的jobdatamap是共用的,其他的,比如,job本身,trigger等,仍然每次執行

的時候是全新的物件。所以,只有jobdetail的jobdatamap是共用的,其他的trigger.getjobdatamap(),context.getmergedjobdatamap(),等這些jobdatamap,任然是全新的

以下引用文件:

使用有狀態的 job

當你需要在兩次 job 執行間維護狀態的話,quartz 框架為此提供了 org.quartz.statefuljob 介面。statefuljob 介面僅僅是擴充套件了 job 介面,未加入新的方法。你只需要通過使用與 job 介面相同的execute() 方法簡單的實現 statefuljob 介面即可。假如你有已存在的 job 類,你所有要做的只是改變 job 的介面為 org.quartz.statefuljob。

job 和 statefuljob 在框架中使用中存在兩個關鍵差異。首先,jobdatamap 在每次執行之後重新持久化到 jobstore 中

。這樣就確保你對 job 資料的改變直到下次執行仍然保持著。

改變有狀態 job 的 

jobdatamap

你可以在有狀態 job 中簡單的通過 map 的 put() 方法來修改 jobdatamap.已存在的任何資料會被新的資料覆蓋掉。你也能對無狀態的 job 這麼做,但是因為對於無狀態 job 來說,jobdatamap 不會持久化,所以資料不會儲存下來。對於 trigger 和 jobexecutioncontext 上的jobdatamap 的資料修改也是沒能儲存下來的。

另 乙個無狀態和有狀態 job 重大區別就是:兩個或多個有狀態的 jobdetail 例項不能併發執行。說的是你建立並註冊了乙個有狀態 jobdetail 到 scheduler 上。你還建立了兩個 trigger 來觸發這個 job:乙個每五分鐘觸發,另乙個也是每五分釧觸發。假如這兩個 trigger 試圖在同一時刻觸發 job,框架是不允許這種事情發生的。第二個 trigger 一直會被阻塞直到第乙個結束。

這就產生了處理 

jobdatamap 儲存的需求了。因為 

jobdatamap 的儲存是伴隨著 

jobdetail 的,而 

jobdetail 定義了 job 例項,所以執行緒安全性問題必須納入到我們考慮的範疇。同一時刻只能由乙個執行緒去執行並更新 

jobdatamap 儲存。然而,由於在第乙個 trigger 有機會更新儲存之前第二個就會試圖執行 job,所以資料有可能會出錯。甚至可能的話還會第二個 trigger 先於第乙個執行完成(依賴於你的 job 所做的事情),這時就可能會出現奇怪的結果。

因為這些區別,在你使用 

statefuljob 時可要謹慎了。當你需要避免併發執行乙個 job 時,那麼有狀態 job 就是你最簡單的籌碼了。在 j2ee 的世界裡,有狀態一詞已經引起了一些負面影響,但對於 quartz 卻非如此。

關於QUARTZ有狀態任務全面解析

size medium 前端時間由於工作需要研究了下quartz這個排程器,在網上看了蠻多的資料,其中說的最少最不明白的就是關於quartz的有狀態和無狀態的 job,quartz是怎麼處理的,們基本上都是說有狀態的job時,當這次任務沒有完成,而下次觸發的時間又來了時,都認為是掛起,等待,要考慮很...

檢視Quartz 排程任務 job 的狀態

首先 明確一點什麼是 jobkey jobkey jobkey new jobkey name,group jobkey相當於一把鑰匙連線 所有從 schedule 中 獲取 資訊的鑰匙 如果想獲取 初始化資訊 則scheduler.getjobdetail jobkey getjobdatamap...

獲取Quartz中Job的執行狀態

使用quartz定時排程job,經常需要實時監控job的執行狀態。在這裡,quartz提供了gettriggerstate方法來獲取當前執行狀態。其中返回值分別代表意思如下 state blocked 4 阻塞 state complete 2 完成 state error 3 錯誤 state n...