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

Sot*_*lis 3 java quartz-scheduler

我有一个Quartz Job,我可以安排一些Cron Trigger.

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); 
Run Code Online (Sandbox Code Playgroud)

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

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

我可以这样做

scheduler.deleteJob(name, group);
scheduler.scheduleJob(jobDetail, trigger); 
// where jobDetail.getJobDataMap() has the updated reportSchedule
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Quartz 1.6.0.

Sot*_*lis 13

解决方案很简单,只需要知道API.

所述Scheduler类具有以下方法

Scheduler#addJob(JobDetail, boolean);
Run Code Online (Sandbox Code Playgroud)

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

所以

// 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 为此,作业需要是持久的,否则将抛出异常,默认情况下新作业是不持久的,因此需要通过在“JobBuilder”上调用“.storeDurably(true)”来设置它 (4认同)