我有一个 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
的情况下修改作业之间的 JobDetail
或 JobDataMap
?
我正在使用 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/