Политики Quartz для обработки не отработавших вовремя заданий
Glossary Item Box
Общие сведения
В Quartz существуют как политики, общие для всех типов триггеров, так и политики, специфичные для конкретного типа триггера. В таблице 1 перечислены все политики, используемые для триггеров SimpleTrigger, CronTrigger и CalendarIntervalTrigger.
Табл. 1. — Политики триггеров
Политика Quartz | Значение MISFIRE_ |
Значение Terrasoft. |
Тип триггера |
---|---|---|---|
IgnoreMisfirePolicy | -1 | IgnoreMisfirePolicy | для всех типов |
Описание поведения IgnoreMisfirePolicy Триггеры с IgnoreMisfirePolicy будут обязательно выполнены. Соответственно, для таких триггеров Quartz не будет обновлять время следующего запуска (NEXT_FIRE_TIME). Все просроченные задания Quartz попытается выполнить как можно скорее, после чего вернется к изначальному расписанию триггера. Например, запланировано задание с триггером SimpleTrigger на 10 повторений. Исходные условия:
Если планировщик был выключен с 8:50 до 9:20, то при включении Quartz попытается как можно скорее выполнить 2 просроченных задания (в 9:00 и 9:15). Далее он будет выполнять 8 оставшихся заданий по расписанию — в 9:30; 9:45 и т.д. |
|||
SmartPolicy | 0 | SmartPolicy | для всех типов |
Описание поведения SmartPolicy Используется Quartz по умолчанию для всех типов триггеров. В зависимости от типа и конфигурации триггера Quartz выберет соответствующую политику. В псевдокоде ниже приведен алгоритм выбора для версии Quartz 2.3.2. if (TRIGGER_TYPE == 'SIMPLE') // Триггер Simple. if (REPEAT_COUNT == 0) // Без повторов. MISFIRE_INSTR = 1 // SimpleTrigger.FireNow else if (REPEAT_COUNT == -1) // Повторять бесконечно. MISFIRE_INSTR = 4 // SimpleTrigger.RescheduleNextWithRemainingCount else // Указано количество повторов. MISFIRE_INSTR = 2 // SimpleTrigger.RescheduleNowWithExistingRepeatCount else if (TRIGGER_TYPE == 'CAL_INT') // Триггер СalendarInterval. MISFIRE_INSTR = 1 // CalendarIntervalTrigger.FireOnceNow else if (TRIGGER_TYPE == 'CRON') // Триггер Cron. MISFIRE_INSTR = 1 // CronTrigger.FireOnceNow |
|||
SimpleTrigger. |
1 | FireNow | SimpleTrigger |
Описание поведения SimpleTrigger.FireNow Применяется для триггеров SimpleTrigger у которых значение REPEAT_COUNT равно 0 (триггеры, рассчитанные на 1 запуск). Если значение REPEAT_COUNT не равно 0, то будет применена политика SimpleTrigger.RescheduleNowWithRemainingRepeatCount. Например, запланировано задание с триггером SimpleTrigger. Исходные условия:
Если планировщик был выключен с 8:50 до 9:20, то при включении Quartz попытается как можно скорее выполнить задание. В результате, в 9:20 или чуть позже задание будет выполнено. |
|||
SimpleTrigger. |
2 | RescheduleNowWithExistingRepeatCount | SimpleTrigger |
Описание поведения SimpleTrigger.RescheduleNowWithExisting Планировщик пытается как можно скорее выполнить первое просроченное задание. Все остальные запуски триггера будут выполнены с интервалом REPEAT_INTERVAL. Например, запланировано задание с триггером SimpleTrigger на 10 повторений. Исходные условия:
Если планировщик был выключен с 8:50 до 9:20, то при включении Quartz выполнит первое просроченное задание, назначенное на 9:00, (из заданий в 9:00 и 9:15) в 9:20. Оставшиеся 9 запусков выполнит в 9:35, 9:50 и т.д. . К СВЕДЕНИЮ Для методов AppScheduler.ScheduleMinutelyJob поведение RescheduleNowWithExistingRepeatCount идентично RescheduleNowWithRemainingRepeatCount, а поведение RescheduleNextWithRemainingCount идентично RescheduleNextWithExistingCount, поскольку используются триггеры с REPEAT_COUNT = -1. |
|||
SimpleTrigger. |
3 | RescheduleNowWithRemainingRepeatCount | SimpleTrigger |
Описание поведения SimpleTrigger.RescheduleNowWithRemaining Планировщик пытается как можно скорее выполнить первое просроченное задание. Остальные просроченные задания игнорируются. Планировщик выполняет оставшиеся задания, которые не были просрочены, с интервалом REPEAT_INTERVAL. Например, запланировано задание с триггером SimpleTrigger на 10 повторений. Исходные условия:
Если планировщик был выключен с 8:50 до 9:20, то при включении Quartz выполнит первое просроченное задание (из заданий в 9:00 и 9:15) в 9:20. Второе просроченное задание будет проигнорировано, и оставшиеся 8 запусков будут выполнены в 9:35, 9:50 и т.д. |
|||
SimpleTrigger. |
4 | RescheduleNextWithRemainingCount | SimpleTrigger |
Описание поведения SimpleTrigger. Планировщик игнорирует просроченные задания и ждет следующего планового запуска задания. При наступлении времени следующего запуска будут выполнены оставшиеся не просроченные задания с интервалом REPEAT_INTERVAL. Например, запланировано задание с триггером SimpleTrigger на 10 повторений. Исходные условия:
Если планировщик был выключен с 8:50 до 9:20, то при включении Quartz выполнит оставшиеся 8 непросроченных заданий в 9:30; 9:45 и т.д. |
|||
SimpleTrigger. |
5 | RescheduleNextWithExistingCount | SimpleTrigger |
Описание поведения SimpleTrigger. Планировщик будет ждать следующего времени запуска и выполнит все оставшиеся задания с интервалом REPEAT_INTERVAL. Например, запланировано задание с триггером SimpleTrigger на 10 повторений. Исходные условия:
Если планировщик был выключен с 8:50 до 9:20, то при включении Quartz выполнит все 10 заданий в 9:30; 9:45 и т.д. |
|||
CronTrigger. |
1 | - | CronTrigger |
Описание поведения CronTrigger.FireOnceNow Планировщик пытается как можно скорее выполнить первое просроченное задание. Остальные просроченные задания игнорируются. Оставшиеся непросроченные задания планировщик выполняет согласно с расписанием. Например, запланировано задание с триггером CronTrigger: CRON_EXPRESSION = '0 0 9-17 ? * MON-FRI' (с понедельника по пятницу с 9:00 до 17:00). Если планировщик был выключен с 8:50 до 10:20, то при включении в 10:20 Quartz выполнит первое просроченное задание из двух (в 9:00 и 10:00). Далее задания будут выполняться в 11:00, 12:00 и т.д. |
|||
CronTrigger. |
2 | - | CronTrigger |
Описание поведения CronTrigger.DoNothing Планировщик игнорирует все просроченные задания. Оставшиеся непросроченные задания выполняются согласно с расписанием. Например, запланировано задание с триггером CronTrigger: CRON_EXPRESSION = '0 0 9-17 ? * MON-FRI' (с понедельника по пятницу с 9:00 до 17:00). Если планировщик был выключен с 8:50 до 10:20, то при включении Quartz начнет выполнять задания с 11:00 (в 11:00, 12:00 и т.д). |
|||
CalendarIntervalTrigger. |
1 | - | CalendarIntervalTrigger |
Описание поведения CalendarIntervalTrigger.FireOnceNow Поведение аналогично CronTrigger.FireOnceNow. |
|||
CalendarIntervalTrigger. |
2 | - | CalendarIntervalTrigger |
Описание поведения CalendarIntervalTrigger.DoNothing Поведение аналогично CronTrigger.DoNothing. |