更新现有的JobDataMap

时间:2010-05-13 19:35:47

标签: java persistence quartz-scheduler

我有一个已安排的Quartz作业。我想更新与之关联的JobDataMap。如果我得到一个带有JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap()的JobDataMap,该地图是“实时”吗?即。如果我改变它,它会被保存在调度程序中吗?如果没有,我该如何坚持下去?

3 个答案:

答案 0 :(得分:28)

在石英2.0中。不推荐使用StatefulJob。要保留作业数据映射,请在作业类上使用@PersistJobDataAfterExecution。它通常与@DisallowConcurrentExecution一起使用。

答案 1 :(得分:13)

我有一个类似的问题:我有一个第二个触发器,它触发一个有状态的作业,该作业在作业的数据映射中的队列中起作用。每次作业触发时,它都会从队列中轮询并对轮询元素执行一些操作。每次执行作业时,队列只有一个元素(队列从作业中正确更新)。当队列为空时,作业会自行计划。

我希望能够从外部更新正在进行的作业/触发器的参数列表,以便为队列提供更多参数。但是,仅检索数据映射并更新队列是不够的(以下执行显示队列未更新)。问题是Quartz只在执行后更新作业实例的作业数据映射。

以下是我找到的解决方案:

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

最后一行指示Quartz用您提供的作业替换存储的作业。下次激活作业时,它将看到更新的队列。

答案 2 :(得分:7)

请参阅http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03.html

  

可以将作业实例定义为   “有状态的”或“无国有的”。   非有状态的工作只有他们的   JobDataMap当时存储   添加到调度程序。这意味着   对内容所做的任何更改   执行期间的作业数据映射   这份工作将失去,而不会   下次见到这份工作   执行。

     

......有状态的工作正好相反 -   之后重新存储其JobDataMap   每次执行工作。

     

通过实施StatefulJob,您可以将“作业”标记为有状态   界面,而不是Job   接口