Кварцевый планировщик - обновление только 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 и использовать старый триггер?