失敗したHangfire BackgroundJobの再キューを無効にする方法はありますか?
問題が発生する可能性があるため、失敗したジョブを再度実行しないでください。
解決済み、[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();
}
}
IMyJobService
実装を注入するためにBackgroundJob.Enqueue<T>
に依存する代わりに、私は自分で行います。基本的にはそれだけです。これが誰かの役に立つことを願っています。