Как предотвратить повторную попытку выполнения задания Quartz.Net
Я знаю, что могу указать .WithMisfireHandlingInstructionDoNothing() при создании триггера, но некоторые из моих заданий запускаются через метод IScheduler.TriggerJob() , поэтому без каких-либо триггеров.
Я могу обнаруживать и регистрировать пропуски зажигания в слушателе ITriggerListener, но как я могу предотвратить повторную попытку Quartz запустить задание? Если я правильно понимаю .VetoJobExecution нельзя использовать, так как задание должно быть успешно запущено в любом случае.
Есть другие идеи?
2 ответа
Что ж, если вам просто нужно такое поведение, вы можете добиться этого, просто добавив один простой триггер в планировщик, который будет запускаться немедленно, и настроить для этого политику повторных попыток. Итак, если вы можете изменить сайты звонков
TriggerJob
чтобы вместо этого создать простой триггер (возможно, метод расширения, позволяющий определять политику), источник Quartz для TriggerJob находится здесь.
Думаю, я понял.
Вы должны использовать политику WithMisfireHandlingInstructionNextWithRemainingCount и WithRepeatCount(0).
Но хитрость здесь заключается в том, чтобы установить правильное значение в IScheduler MisfireThreshold, чтобы осечка считалась настоящей осечкой. Я имею в виду, что если ваш порог пропуска зажигания установлен на 60 секунд (по умолчанию), то любое задание, не выполненное менее чем за 60 секунд до запланированного, НЕ будет считаться пропуском зажигания. Таким образом, политика осечки использоваться не будет.
В моем случае с заданиями продолжительностью 3 секунды мне пришлось установить WithMisfireThreshold на 1 секунду или меньше.
Таким образом, задание не повторяется, если «действительно произошла осечка».