java - Quartz Scheduler - 在作业之间仅更新 JobDataMap

标签 java quartz-scheduler

我有一个 Quartz 作业,我可以使用一些 Cron 触发器来安排它。

ReportSchedule reportSchedule = ... // my object
JobDetail jobDetail = new JobDetail(reportSchedule.getScheduleName(), 
                                    reportSchedule.getScheduleGroup(),
                                    ExtendedReportJob.class /* my job */);

jobDetail.getJobDataMap().put("reportSchedule", reportSchedule);
jobDetail.setDescription(reportSchedule.getScheduleDescription());
CronTrigger trigger = ...; // depends on the report schedule 

scheduler.scheduleJob(jobDetail, trigger); 

此代码成功地将作业和详细信息写入数据库

reportSchedule 对象包含作业所需的特定参数。但是,我可能想更改参数。

我可以用

scheduler.deleteJob(name, group);
scheduler.scheduleJob(jobDetail, trigger); 
// where jobDetail.getJobDataMap() has the updated reportSchedule

然而,这样做会立即触发作业,因为触发取决于报告计划,我不想更改它(我想保留原始日期)。所以我的问题是:有没有办法在不更改 Trigger 的情况下修改作业之间的 JobDetailJobDataMap

我正在使用 Quartz 1.6.0。

最佳答案

解决方案很简单,只需要了解 API。

Scheduler 类有以下方法

Scheduler#addJob(JobDetail, boolean);

如果 boolean 参数设置为 true,则传递的 JobDetail 将覆盖前一个。

所以

// name and group are the primary key of the job detail
final JobDetail jobDetail = new JobDetail(name, group, ExtendedReportJob.class);

// reportSchedule is the object I've previously modified
jobDetail.getJobDataMap().put(ORStatics.REPORT_SCHEDULE, reportSchedule);
jobDetail.setDescription(reportSchedule.getScheduleDescription());

// overwrite the previous job, however retaining the triggers       
scheduler.addJob(jobDetail, true);

将更新持久存储中的作业详细信息。由于包含 JobDetail 的表的主键将保持不变,因此我们不需要更改触发器。他们仍然会如期执行。

关于java - Quartz Scheduler - 在作业之间仅更新 JobDataMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15951731/

相关文章:

java - 添加到触发器的 JobData 未传递给 Quartz 中的作业

java - Spring 调度: @Scheduled vs Quartz

java - sqlite 数据库未填充且查询不起作用

java - 在将数据转换为 XML 之前对其进行预处理?

java - Eclipse 两次加载相同的编辑器面板

java - Quartz Job @ExecuteInJTATransaction - 无法在 wildfly 10 中获取 UserTransaction

java - 如何使用 Spring Batch 解析 XML 的选定部分并将其转换为 Java POJO

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - Quartz 中每 n 周的工作日 a 和 b 的 x 点执行一次作业

grails - 如何限制 Quartz 作业总数和集群中单个节点上运行的数量