c# retry Disabilita il ri-accodamento di Hangfire BackgroundJob fallito




hangfire retry (4)

C'è un modo per disabilitare il re-accodamento di un Hangfire BackgroundJob fallito?

Non vogliamo che i lavori falliti vengano nuovamente eseguiti in quanto ciò potrebbe causare problemi.


Importante se si utilizza il contenitore DI con un'interfaccia, è necessario inserire l'attributo nella definizione dell'interfaccia

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

Coda il lavoro in questo modo

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

Provalo semplicemente lanciando qualsiasi vecchia eccezione all'interno della tua implementazione. Se lo hai fatto bene, lo vedrai nella cronologia del lavoro sotto "cancellato".


Risolto, usando [AutomaticRetry (Attempts = 0)]


Mi sono imbattuto in un problema simile e sono riuscito a trovare una soluzione. L'utilizzo di un filtro globale non era un'opzione per me. Sto usando il nucleo di asp.net e ho un semplice fuoco e dimentico il lavoro in background. Per qualche motivo l' AutomaticRetryAttribute veniva ignorato. Si è scoperto il modo in cui aggiungevo che il lavoro era la chiave della mia soluzione. Ho avuto un codice simile nella mia app che stava causando il problema:

BackgroundJob.Enqueue<IMyJobService>(js => js.DoWork());

Nella mia implementazione IMyJobService avevo il seguente codice:

[AutomaticRetry(Attempts = 0)]
public void DoWork()
{
    // I'm working hard here
}

La soluzione che ho trovato era:

public MyTestController
{
    private readonly IMyJobService _myJobService;

    public MyTestClass(IMyJobService myJobService)
    {
        _myJobService = myJobService;
    }

    public ActionResult Work()
    {
        BackgroundJob.Enqueue(() => _myJobService.DoWork());
        return Ok();
    }
}

Invece di fare affidamento su BackgroundJob.Enqueue<T> per iniettare la mia implementazione IMyJobService lo faccio da solo. Questo è fondamentalmente. Spero che questo possa aiutare qualcuno.


Puoi annotare il metodo da eseguire in background con il seguente attributo:

[AutomaticRetry(Attempts = 0)]

O impostalo globalmente:

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




hangfire