Планировщик Quartz — игнорирует неудачное задание — withMisfireHandlingInstructionDoNothing() не работает

#java #quartz-scheduler #jobs

#java #quartz-планировщик #Вакансии

Вопрос:

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

Для этого я попробовал ниже :

 TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup)
            .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)
                      .withMisfireHandlingInstructionDoNothing())
            .withPriority(jobPriority).build();
 

Это задание запускается еженедельно каждый вторник. Скажем, в один вторник служба не работала, и она появляется в пятницу. Тогда задание должно сработать в следующий вторник, а не при запуске службы.

Но приведенный выше код не работает. задание запускается, как только появляется служба.

Примечание: я вручную перенаправляю время для проверки этого.(В случае, если это имеет какое-либо значение)

Ответ №1:

Кажется, я понял.

Чтобы инструкция MisfireHandlingInstruction вступила в силу, задержка должна быть больше значения, установленного

org.quartz.JobStore.misfireThreshold = 60000

иначе quartz никогда не обрабатывает триггер как осечку. таким образом, инструкция misfire не вступит в силу.

Отсюда

Прежде чем я углублюсь в детали, есть еще один вариант конфигурации, который следует описать. Это org.quartz.JobStore.пороговое значение ошибки (в миллисекундах), по умолчанию равное 60000 (в минуту). Он определяет, как поздно триггер должен считаться пропущенным. При настройке по умолчанию, если триггер должен был быть запущен 30 секунд назад, Quartz с радостью просто запустит его. Такая задержка не считается пропуском. Однако, если триггер обнаружен через 61 секунду после запланированного времени, специальный поток обработчика пропусков позаботится об этом, подчиняясь инструкции misfire. В целях тестирования мы установим для этого параметра значение 1000 (1 секунда), чтобы мы могли быстро проверить пропуски.