我有一個已經安排好的石英作業。我想更新與之關聯的JobDataMap。如果我得到一個帶有JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap()
的JobDataMap,那個地圖是否是「活的」?即。如果我改變它,它會在調度程序中持久嗎?如果不是,我該如何堅持下去?更新現有的JobDataMap
回答
參見http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03.html:
作業實例可以被定義爲 「有狀態」 或 「非狀態」。 非狀態作業只有在 被添加到調度程序時,它們的JobDataMap纔會存儲它們的 。這意味着 任務在執行 期間對作業數據映射的內容 所做的任何更改都將丟失,並且在下次執行 時不會執行 。
...一個有狀態的工作正好相反 - 它的JobDataMap被重新存儲在 之後,每執行一次工作。
通過讓Job實現StatefulJob 接口而不是Job 接口,將「作業」標記爲有狀態。
我有一個類似的問題:我有第二個觸發器觸發作業的數據映射隊列中的狀態作業。每次作業激發時,它都會從隊列中輪詢並對輪詢的元素執行一些工作。每執行一次作業,隊列中的一個元素就會減少(隊列從作業中正確更新)。當隊列爲空時,該作業將自行排除。
我希望能夠在外部更新正在進行的作業/觸發器的參數列表,以向隊列提供更多參數。但是,僅檢索數據映射並更新隊列是不夠的(以下執行顯示隊列未更新)。問題在於Quartz只會在執行後更新作業實例的作業數據映射。
這是我找到了解決辦法:
JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup");
jobDetail.getJobDataMap.put("jobQueue", updatedQueue);
scheduler.addJob(jobDetail, true);
最後一行指示Quartz來替換你提供一個存儲作業。下一次作業被解僱時,將會看到更新的隊列。
使用最新版本的Quartz(2.6.10?) – 2013-03-13 01:24:35
似乎存在一個問題對不起 - 這是版本2.1.7 ...以前工作良好2.1.6以前 – 2013-03-13 20:31:51
在石英2.0。 StatefulJob
已棄用。爲了保留作業數據圖,請在作業類上使用@PersistJobDataAfterExecution
。它通常與@DisallowConcurrentExecution
一起使用。
感謝您的信息Bozho。 – 2012-07-12 06:54:20
但是在哪個表中我們可以找到JobDataMap信息,我檢查了所有的表格,但是我找不到它們。 – 2012-07-12 06:55:59
它是QRTZ_JOB_DETAILS表的Job_data列嗎? – 2012-07-12 07:08:32
- 1. Quartz Scheduler - 只更新JobDataMap,作業之間
- 2. 石英的JobDataMap
- 3. 更新現有EntityCollection
- 4. 現有更新中的SQLServer
- 5. 更新現有的選項
- 6. 更新現有的列值
- 7. Sqlite-更新現有的表
- 8. 更新現有的NetworkLink
- 9. 更新現有文檔的新字段
- 10. 執行前訪問JobDatamap
- 11. 在Quartz.NET中修改JobDataMap
- 12. @cacheput沒有更新現有的緩存
- 13. 更新現有記錄
- 14. Sitefinity - 更新現有模型
- 15. HBase更新現有行
- 16. 更新現有通知
- 17. 上更新現有記錄
- 18. JTable更新沒有出現
- 19. CMS更新現有站點
- 20. Django現有cookie未更新
- 21. 更新現有列值
- 22. 用新值更新現有對象
- 23. 用django中的更新項更新現有的緩存數據
- 24. Solr的:更新現有的文件只
- 25. Magento重寫現有的表單並更新現有的字段
- 26. 在Quartz的JobDataMap中傳遞BlockingQueue
- 27. 在Quatz作業中觸發的JobDataMap xml
- 28. 對現有項目的AFNetworking 2.0更新
- 29. matplotlib - 用點更新現有的地塊
- 30. 對現有應用程序的更新
但是如果我想從執行之外更新作業呢?例如來自JMX? – 2013-02-07 15:12:26