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