我有一个已经被调度的Quartz任务。 我想更新与其关联的JobDataMap。如果我使用JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap()
获取一个JobDataMap,那么这个Map是"实时的"吗?也就是说,如果我更改了它,它会在调度程序中持久化吗?如果不是,我应该如何持久化它?
我有一个已经被调度的Quartz任务。 我想更新与其关联的JobDataMap。如果我使用JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap()
获取一个JobDataMap,那么这个Map是"实时的"吗?也就是说,如果我更改了它,它会在调度程序中持久化吗?如果不是,我应该如何持久化它?
在Quartz 2.0版本中,StatefulJob
已经被弃用。为了持久化任务数据映射,请在作业类上使用@PersistJobDataAfterExecution
注解,通常与@DisallowConcurrentExecution
一起使用。
我遇到了类似的问题:我有一个每秒触发一次的定时器,会启动一个有状态的作业,并在作业的数据映射中操作队列。每次作业触发时,它会从队列中轮询并对轮询到的元素执行一些操作。随着每个作业的执行,队列中的元素会减少一个(队列会在作业内部正确更新)。当队列为空时,该作业会取消自己的计划。
我想要能够在进行中的作业/触发器上外部更新参数列表,以提供更多参数到队列中。然而,仅检索数据映射并更新队列是不够的(下一次执行显示队列未更新)。问题在于Quartz只在执行后更新作业实例的作业数据映射。
以下是我找到的解决方案:
JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup");
jobDetail.getJobDataMap.put("jobQueue", updatedQueue);
scheduler.addJob(jobDetail, true);
最后一行指示Quartz使用您提供的作业替换存储的作业。 下次作业触发时,它将看到更新后的队列。