Вопрос:

Проверьте, запущено ли повторяющееся задание Hangfire.

.net asp.net-core hangfire

2536 просмотра

2 ответа

597 Репутация автора

У меня есть веб-приложение, которое использует Hangfire для фоновых задач и заданий.

У меня есть повторяющаяся работа, когда 2 экземпляра этой работы не могут выполняться одновременно. Допустим, работа выполняется дольше.

Я хотел бы проверить, выполняется ли задание в данный момент, и если да, не запускать повторно.

Я посмотрел вокруг и не могу найти никакой информации по этому вопросу.

Автор: Wesley Skeen Источник Размещён: 05.01.2018 10:42

Ответы (2)


1 плюс

42 Репутация автора

Мы используем фильтры заданий, а именно этот: MaximumConcurrentExecutions - https://github.com/alastairtree/Hangfire.MaximumConcurrentExecutions, который предотвратит запуск нескольких экземпляров вашей работы.

вы также можете посмотреть DisableConcurrentExecution - https://discuss.hangfire.io/t/disableconcurentexecution-does-not-appear-to-work/158 .

Они оба служат схожей цели: первая позволяет ограничить максимум числом> 1, тогда как использование последней не допускает одновременной обработки задания.

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

Автор: Francois Размещён: 18.04.2018 03:08

1 плюс

903 Репутация автора

Есть несколько мест, где есть ответы на некоторые вопросы, но чтобы полностью это заработать, мне пришлось сделать ДВА:

  1. Знать атрибуты
  2. Поместите их в интерфейс, а не метод реализации

Поэтому, если вы используете интерфейсы (например, с внедрением зависимостей) для запуска задания Hangfire, поместите их в определение интерфейса

[DisableConcurrentExecution(10)]
[AutomaticRetry(Attempts = 0, LogEvents = false, OnAttemptsExceeded = AttemptsExceededAction.Delete)]

Если вы не сделаете атрибут AutomaticRetry таким образом, по умолчанию задание будет добавлено в список запланированных заданий, который будет выполняться после завершения первого.

Это работает так, как я хотел:

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

Если вы поместите их в метод, который реализует интерфейс, он ничего не делает.

Автор: TechSavvySam Размещён: 06.09.2018 08:25
Вопросы из категории :
32x32