Обновите существующий JobDataMap

У меня есть Кварцевое задание, которое было уже запланировано. Я хочу обновить JobDataMap, связанный с ним. Если я получаю JobDataMap с JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap(), та карта "жива"? т.е. если я изменю его, то это будет сохранено в планировщике? В противном случае, как я сохраняю его?

14
задан Jalal 12 November 2012 в 23:00
поделиться

2 ответа

Смотрите http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03.html:

Экземпляр задания может быть определен как. "stateful" или "non-stateful". Нестационарные задания имеют только свои JobDataMap хранится только в момент их добавлены в планировщик. Это означает что любые изменения, внесенные в содержимое карты данных задания во время выполнения задания, будут потеряны и не будут видны заданию в следующий раз, когда оно при следующем выполнении.

...задание с состоянием является прямо противоположным - его карта данных задания хранится заново после после каждого выполнения задания.

Вы "помечаете" задание как stateful, реализуя интерфейс StatefulJob. а не интерфейс Job интерфейс.

7
ответ дан 1 December 2019 в 06:15
поделиться

У меня была похожая проблема: у меня есть триггер secondly, который запускает stateful job, работающий с очередью в карте данных job'а. При каждом запуске задания оно опрашивает очередь и выполняет определенную работу над опрошенным элементом. С каждым выполнением задания в очереди становится на один элемент меньше (очередь обновляется корректно изнутри задания). Когда очередь пуста, задание само себя отменяет.

Я хотел иметь возможность извне обновлять список аргументов текущего задания/триггера, чтобы предоставить больше аргументов в очередь. Однако простого получения карты данных и обновления очереди было недостаточно (следующее выполнение показывает, что очередь не обновляется). Проблема в том, что Quartz обновляет карту данных экземпляра задания только после его выполнения.

Вот решение, которое я нашел:

JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup");
jobDetail.getJobDataMap.put("jobQueue", updatedQueue);
scheduler.addJob(jobDetail, true);

Последняя строка инструктирует Quartz заменить сохраненное задание на то, которое вы предоставили. При следующем запуске задания оно увидит обновленную очередь.

13
ответ дан 1 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: