Hangfire: Как пропустить одновременное выполнение, не прерывая работу

Созданный на 11 июл. 2017  ·  4Комментарии  ·  Источник: HangfireIO/Hangfire

У меня есть ежеминутно повторяющееся задание, которое использует DisableConcurrentExecution(timeout:0) (0 повторных попыток), так как только один рабочий должен обрабатывать его в данный момент времени, особенно если задание занимает больше минуты (это может быть разным).

Я не хочу, чтобы "пропущенные" задания помечались как failed на панели управления, поэтому я хотел добавить SkipConcurrentExecutionAttribute который был бы почти идентичен DisableConcurrentExecutionAttribute , за исключением что он попытается / поймает захват блокировки, проглотит DistributedLockTimeoutException и установит задание на DeletedState с указанием причины.

Но я не могу сделать это должным образом, потому что GetResource () является закрытым, а его реализация относится к другим внутренним методам библиотеки.
$"{job.Type.ToGenericTypeString()}.{job.Method.Name}" кажется безопасным способом создания неконфликтных имен распределенных блокировок, но я не могу ссылаться на него.
Можем ли мы иметь в библиотеке общедоступный метод, который генерирует имя распределенной блокировки задания?

см. https://discuss.hangfire.io/t/disableconcurentexecution-for-job-groups/1389/4

question

Самый полезный комментарий

@dgaspar , вы можете указать планировщику повторяющихся заданий пропустить создание следующего повторяющегося задания, когда предыдущее все еще выполняется, просмотрите эту суть: https://gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.

Все 4 Комментарий

Я только что заметил, что filterContext.BackgroundJob.Job.ToString() выдаст ту же строку, что и внутренние реализации TypeExtensions.cs и DisableConcurrentExecutionAttribute.cs (re) ... проблема решена.

@dgaspar , вы можете указать планировщику повторяющихся заданий пропустить создание следующего повторяющегося задания, когда предыдущее все еще выполняется, просмотрите эту суть: https://gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.

Спасибо за предложение @odinserj. Я заметил, что если во время выполнения происходит сбой рабочего, эта строка «Выполняется» останется в хеш-таблице. Помешает ли это перепланировать задание, пока я не удалю эту строку вручную? Или мне не хватает срока действия / очистки? (кстати, я использую new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) } , если это важно)

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

cindro picture cindro  ·  3Комментарии

tompazourek picture tompazourek  ·  3Комментарии

cottsak picture cottsak  ·  3Комментарии

JvanderStad picture JvanderStad  ·  3Комментарии

plmwong picture plmwong  ·  3Комментарии