У меня есть задание Quartz, которое уже запланировано. Я хочу обновить связанную с ним карту JobDataMap. Если я получу JobDataMap с JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap()
, будет ли эта карта «действующей»? т.е. если я изменю его, он сохранится в планировщике? Если нет, то как мне его сохранить?
Обновите существующую карту JobDataMap
Ответы (3)
См. http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03. HTMLа>:
Экземпляр задания может быть определен как «с сохранением состояния» или «с сохранением состояния». JobDataMap заданий без сохранения состояния сохраняется только в момент их добавления в планировщик. Это означает, что любые изменения, сделанные в содержимом карты данных задания во время выполнения задания, будут потеряны и не будут видны заданию при следующем выполнении.
... задание с состоянием как раз наоборот - его JobDataMap повторно сохраняется после каждого выполнения задания.
Вы «помечаете» задание как отслеживающее состояние, если оно реализует интерфейс StatefulJob, а не интерфейс задания.
В кварце 2.0. StatefulJob
устарел. Чтобы сохранить карту данных задания, используйте @PersistJobDataAfterExecution
в классе задания. Обычно это идет с @DisallowConcurrentExecution
.
У меня была аналогичная проблема: у меня есть второй триггер, который запускает задание с отслеживанием состояния, которое работает в очереди на карте данных задания. Каждый раз, когда задание запускается, оно опрашивает очередь и выполняет некоторую работу с опрашиваемым элементом. С каждым выполнением задания в очереди становится на один элемент меньше (очередь корректно обновляется внутри задания). Когда очередь пуста, задание отменяет свое планирование.
Я хотел иметь возможность внешнего обновления списка аргументов текущего задания/триггера, чтобы предоставить больше аргументов в очередь. Однако простого извлечения карты данных и обновления очереди было недостаточно (следующее выполнение показывает, что очередь не обновлена). Проблема в том, что Quartz обновляет карту данных задания экземпляра задания только после выполнения.
Вот решение, которое я нашел:
JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup");
jobDetail.getJobDataMap.put("jobQueue", updatedQueue);
scheduler.addJob(jobDetail, true);
Последняя строка указывает Quartz заменить сохраненное задание тем, которое вы предоставляете. В следующий раз, когда задание будет запущено, оно увидит обновленную очередь.