更新现有的JobDataMap

Pau*_*lin 14 java persistence quartz-scheduler

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

Boz*_*zho 31

在石英2.0.StatefulJob已弃用.为了保留作业数据映射,请@PersistJobDataAfterExecution在作业类上使用.它通常伴随着@DisallowConcurrentExecution.


小智 13

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

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

这是我找到的解决方案:

JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup");
jobDetail.getJobDataMap.put("jobQueue", updatedQueue);
scheduler.addJob(jobDetail, true);
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*mmi 7

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

Job实例可以定义为"有状态"或"无状态".非有状态作业仅在将JobDataMap添加到调度程序时存储它们.这意味着在执行作业期间对作业数据映射的内容所做的任何更改都将丢失,并且下次执行时作业将不会看到这些更改.

...有状态的工作正好相反 - 每次执行作业后都会重新存储JobDataMap.

通过让Job实现StatefulJob接口而不是Job接口,您可以将Job标记为有状态.

  • 但是,如果我想从执行外部更新作业怎么办?例如来自JMX? (2认同)