Отключить повторную постановку неудачного фонового задания Hangfire

Есть ли способ отключить повторное постановление в очередь неудачного фонового задания Hangfire?

Мы не хотим, чтобы сбойные задания выполнялись снова, так как это может вызвать проблемы.

Ответы

Ответ 1

Решено с использованием [AutomaticRetry(Attempts = 0)]

Ответ 2

Вы можете либо аннотировать метод для запуска в фоновом режиме с помощью следующего атрибута:

[AutomaticRetry(Attempts = 0)]

Или установите это глобально:

GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });

Ответ 3

Важно, если вы используете DI-контейнер с интерфейсом, вы должны поместить атрибут в определение интерфейса

public interface IDataUpdater
{
    [Hangfire.AutomaticRetry(Attempts = 0, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
    void UpdateData();
}

Поставить работу в очередь вот так

Hangfire.RecurringJob.AddOrUpdate<IDataUpdater>(updater => updater.UpdateData(), Cron.Hourly);

Проверьте это, просто бросив любое старое исключение в вашей реализации. Если вы все сделали правильно, вы увидите это в истории заданий в разделе "удалено".

enter image description here

Ответ 4

У меня возникла аналогичная проблема, и я смог найти решение. Использование глобального фильтра не было для меня вариантом. Я использую ядро ​​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, я делаю это сам. Это в основном это. Надеюсь, это поможет кому-то.