Обновите существующую карту JobDataMap

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


person Paul Tomblin    schedule 13.05.2010    source источник


Ответы (3)


См. http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03. HTML:

Экземпляр задания может быть определен как «с сохранением состояния» или «с сохранением состояния». JobDataMap заданий без сохранения состояния сохраняется только в момент их добавления в планировщик. Это означает, что любые изменения, сделанные в содержимом карты данных задания во время выполнения задания, будут потеряны и не будут видны заданию при следующем выполнении.

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

Вы «помечаете» задание как отслеживающее состояние, если оно реализует интерфейс StatefulJob, а не интерфейс задания.

person Tommi    schedule 20.05.2010
comment
но что, если я хочу обновить задание вне выполнения? например из JMX? - person Simon Gibbs; 07.02.2013

В кварце 2.0. StatefulJob устарел. Чтобы сохранить карту данных задания, используйте @PersistJobDataAfterExecution в классе задания. Обычно это идет с @DisallowConcurrentExecution.

person Bozho    schedule 25.08.2011
comment
Но в какой таблице мы можем найти информацию JobDataMap, я проверил все таблицы, но не нашел их. - person Sangram Anand; 12.07.2012
comment
Это столбцы Job_data таблицы QRTZ_JOB_DETAILS? - person Sangram Anand; 12.07.2012
comment
Я не знаю, я не настроил сохранение базы данных заданий - person Bozho; 13.07.2012
comment
Да, информацию можно найти в таблицах QRTZ_JOB_DETAILS. - person iec2011007; 31.07.2018
comment
сложная часть состоит в том, чтобы записать обе аннотации PersistJobDataAfterExecution и DisallowConcurrentExecution в классе задания. - person Antonio Martin; 10.05.2019

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

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

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

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

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

person Leo    schedule 23.06.2010
comment
Кажется, с этим связана проблема с последней версией Quartz (2.6.10?) - person Nigel Sheridan-Smith; 13.03.2013
comment
Извините - это версия 2.1.7... ранее работало нормально с 2.1.6 - person Nigel Sheridan-Smith; 14.03.2013