Ответ 1
Решено с использованием [AutomaticRetry(Attempts = 0)]
Есть ли способ отключить повторное постановление в очередь неудачного фонового задания Hangfire?
Мы не хотим, чтобы сбойные задания выполнялись снова, так как это может вызвать проблемы.
Решено с использованием [AutomaticRetry(Attempts = 0)]
Вы можете либо аннотировать метод для запуска в фоновом режиме с помощью следующего атрибута:
[AutomaticRetry(Attempts = 0)]
Или установите это глобально:
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });
Важно, если вы используете DI-контейнер с интерфейсом, вы должны поместить атрибут в определение интерфейса
public interface IDataUpdater
{
[Hangfire.AutomaticRetry(Attempts = 0, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
void UpdateData();
}
Поставить работу в очередь вот так
Hangfire.RecurringJob.AddOrUpdate<IDataUpdater>(updater => updater.UpdateData(), Cron.Hourly);
Проверьте это, просто бросив любое старое исключение в вашей реализации. Если вы все сделали правильно, вы увидите это в истории заданий в разделе "удалено".
У меня возникла аналогичная проблема, и я смог найти решение. Использование глобального фильтра не было для меня вариантом. Я использую ядро asp.net, и у меня есть простой огонь и забыть работу с фоном. По какой-то причине AutomaticRetryAttribute
игнорировался. Оказалось, что я добавляю, что работа была ключом к моему решению. У меня был аналогичный код в моем приложении, который вызывал проблему:
BackgroundJob.Enqueue<IMyJobService>(js => js.DoWork());
В моей реализации IMyJobService у меня был следующий код:
[AutomaticRetry(Attempts = 0)]
public void DoWork()
{
// I'm working hard here
}
Решение, с которым я столкнулся, было:
public MyTestController
{
private readonly IMyJobService _myJobService;
public MyTestClass(IMyJobService myJobService)
{
_myJobService = myJobService;
}
public ActionResult Work()
{
BackgroundJob.Enqueue(() => _myJobService.DoWork());
return Ok();
}
}
Вместо того чтобы полагаться на BackgroundJob.Enqueue<T>
для внедрения моей реализации IMyJobService
, я делаю это сам. Это в основном это. Надеюсь, это поможет кому-то.