Я пробовал использовать функцию DisallowConcurrentExecution в Quartz.NET, но я нахожу ее немного странной.

Скажем, у меня есть задание Quartz.NET, которое должно выполняться каждую минуту. Затем он засыпает 90 секунд и заканчивает. Атрибут [DisallowConcurrentExecution] гарантирует, что все исполнения, кроме первых, будут пропускаться.

Я хочу, чтобы как только планировщик освободился (в 1:30), выполнялось следующее задание, а когда оно завершается (через 3 минуты), запускается следующее и т. Д. Вместо этого я нахожу следующее:

enter image description here

Он делает то, что я хочу, только половину времени, каждый раз, когда планировщик просто простаивает целую минуту, пока ему не хватает все новых и новых выполнений.

Немного почитав, я подумал, что это результат «умной политики», техники обработки пропусков зажигания по умолчанию. Я попытался установить конкретные, но они не достигли того, о чем я говорил выше. Даже WithMisfireHandlingInstructionNowWithRemainingCount() не работал (см. Снимок экрана), что согласно документы должны

перепланировать «сейчас» (...) с установленным счетчиком повторов таким, каким он был бы, если бы не пропустили ни одного срабатывания.

Так я что-то упускаю, другой вариант или предостережение, или это ошибка на стороне Quartz? Если второе, есть ли обходной путь?

0
Overleaf 5 Окт 2018 в 15:35

1 ответ

Лучший ответ

Оказывается, полная минута простоя была обусловлена ​​свойством misfireThreshold, которое по умолчанию составляет 60 секунд. Я установлю, например, 5 секунд, как показано ниже:

NameValueCollection properties = new NameValueCollection
{
    ["quartz.jobStore.misfireThreshold"] = "5000"
};

Я не уверен, почему порог пропусков зажигания должен задерживать повторные попытки в этом случае, поскольку через несколько минут появляется все больше и больше неудачных выполнений, которые уже ждали более 60 секунд. Вероятно, это можно было считать ошибкой. К счастью, решение этой конкретной проблемы достаточно просто.

0
Overleaf 26 Ноя 2018 в 11:05