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