web-dev-qa-db-ja.com

失敗したHangfire BackgroundJobの再キューイングを無効にする

失敗したHangfire BackgroundJobの再キューを無効にする方法はありますか?

問題が発生する可能性があるため、失敗したジョブを再度実行しないでください。

31
user2992766

解決済み、[AutomaticRetry(Attempts = 0)]を使用

18
user2992766

次の属性を使用して、バックグラウンドで実行するメソッドに注釈を付けることができます。

[AutomaticRetry(Attempts = 0)]

または、グローバルに設定します。

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

インターフェースで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

7
Simon_Weaver

私は同様の問題に遭遇し、解決策を見つけることができました。グローバルフィルターを使用することは私の選択肢ではありませんでした。私は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();
    }
}

IMyJobService実装を注入するためにBackgroundJob.Enqueue<T>に依存する代わりに、私は自分で行います。基本的にはそれだけです。これが誰かの役に立つことを願っています。

4
Stef