4

我有一个 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); 

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

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

我可以做到这一点

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

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

我正在使用石英 1.6.0。

4

2 回答 2

16

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

该类Scheduler具有以下方法

Scheduler#addJob(JobDetail, boolean);

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

所以

// 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将保持不变,因此我们不需要更改触发器。他们仍将按计划执行。

于 2013-04-22T18:22:19.973 回答
0

如何获取触发器getTrigger(String triggerName, String triggerGroup)并将其存储在变量中。然后用你的新 jobDataMap 创建一个新工作并使用旧触发器?

于 2013-04-12T16:37:02.803 回答