Планировщик Quartz.net и IStatefulJob - PullRequest
4 голосов
/ 16 мая 2011

Мне интересно, правильно ли я понимаю?

http://quartznet.sourceforge.net/apidoc/

Инстансы IStatefulJob следуют немного разные правила от обычного IJob экземпляров. Главное отличие в том, что их связанный JobDataMap повторно сохраняется после каждого исполнения работа, таким образом сохраняя состояние для следующее исполнение. Другая разница является то, что задания с сохранением состояния не допускаются Выполнить одновременно, что означает новые триггеры, которые происходят до завершение метода IJob.Execute будет отложено.

Означает ли это, что все триггеры будут отложены до выполнения другого триггера? Если так, как я могу сделать так, чтобы только те же триггеры не сработали, пока не будет выполнен предыдущий триггер.

Скажем, у меня есть триггер А, который срабатывает каждую минуту, но по какой-то причине он медленный и его выполнение занимает полторы минуты. Если я просто использую план IJob, следующий сработает, и я этого не хочу. Я хочу остановить запуск триггера А. до тех пор, пока это не будет сделано.

Однако в то же время у меня есть триггер B, который срабатывает также каждую минуту. Он движется с нормальной скоростью и заканчивается каждую минуту вовремя. Я не хочу, чтобы триггер B удерживался из-за триггера A.

Насколько я понимаю, это произойдет, если я воспользуюсь IStatefulJob.

1 Ответ

3 голосов
/ 22 мая 2011

Короче .. Такое поведение со стороны работы.Поэтому независимо от того, сколько триггеров у вас может быть запущен одновременно только один экземпляр данного IStatefulJob (имя задания, группа заданий определяет идентификатор экземпляра).Таким образом, могут существовать два экземпляра одного и того же типа задания, но не могут быть задания с одинаковыми именами (имя, группа), если задание реализует IStatefulJob.

Если из-за этого триггер пропустил время срабатывания, в игру вступают инструкции пропуска зажигания.Триггер, который пропускает свой следующий выстрел, потому что предыдущий вызов все еще выполняется, решает, что делать, основываясь на его инструкции пропуска зажигания (см. API и учебное пособие).

С простым IJob у вас нет гарантии того, сколько заданий будет запущено одновременно, если у вас есть несколько триггеров для этого и / или происходят пропуски зажигания.IJob - это просто контрактный интерфейс для вызова задания.Quartz.NET 2.0 разделит объединенное поведение IStatefulJob на два отдельных атрибута: DisallowConcurrentExecution и PersistJobDataAfterExecution.

Таким образом, вы можете объединить один и тот же тип задания (IStatefulJobs) с двумя определениями (разными именами заданий) и триггерами с применимыми инструкциями по пропускам зажигания.

...