2010-05-13 3 views
9

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

ответ

6

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

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

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

Вы отмечаете 'на работе с учетом состояния при наличии его реализовать интерфейс StatefulJob , а не интерфейса работы.

+1

но что делать, если я хочу обновить работу за пределами исполнения? например от JMX? –

12

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

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

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

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

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

+0

У вас возникла проблема с последней версией Quartz (2.6.10?) –

+0

Извините, это версия 2.1.7 ... работала нормально с 2.1.6 ранее –

24

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

+0

Спасибо за информацию Bozho. –

+0

Но в какой таблице мы можем найти информацию JobDataMap, я проверил все таблицы, но я не нашел их. –

+0

Это столбец Job_data таблицы QRTZ_JOB_DETAILS? –

Смежные вопросы