Кварцевый планировщик - обновление только JobDataMap, между заданиями

У меня есть Кварцевая Работа, которую я могу запланировать с некоторым 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 или же JobDataMap между работами без изменения Trigger?

Я использую Quartz 1.6.0.

2 ответа

Решение

Решение достаточно простое, просто нужно знать API.

Scheduler класс имеет следующий метод

Scheduler#addJob(JobDetail, boolean);

В котором прошло 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);

обновит детали задания в постоянном хранилище. Поскольку первичный ключ для таблицы, содержащей JobDetail останется прежним, нам не нужно менять триггеры. Они все еще выполнят это как намечено.

Как насчет получения триггера с getTrigger(String triggerName, String triggerGroup) и сохранить его в переменной. Затем создать новую работу с новым jobDataMap и использовать старый триггер?

Другие вопросы по тегам