再試行の回数が役に立たないことがわかっている例外 (または例外のクラス) がある場合は、正しいです。すぐに失敗するのが最善です。
このようなハンドラーがあるとしましょう..
public void Handle(BadMath message)
{
var zero = 0;
var crash = 5 / zero;
var msg = "I will never be reached...";
this.SendReply(msg );
}
そして、div/0 をトラップして高速で失敗させたい...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NServiceBus;
using NServiceBus.Features;
using NServiceBus.SecondLevelRetries.Helpers;
namespace My.Namespace.Messaging.Handlers
{
public class ChangeRetryPolicy : INeedInitialization
{
public void Init()
{
Configure.Features.Disable<SecondLevelRetries>();
Configure.Features.SecondLevelRetries(s => s.CustomRetryPolicy((tm) =>
{
// retry max 3 times
if (TransportMessageHelpers.GetNumberOfRetries(tm) >= 3)
{
// To send back a value less than zero tells the SecondLevelRetry
// satellite not to retry this message anymore.
return TimeSpan.MinValue;
}
if (tm.Headers["NServiceBus.ExceptionInfo.ExceptionType"] == typeof(System.DivideByZeroException).FullName)
{
return TimeSpan.MinValue;
}
return TimeSpan.FromSeconds(5);
}));
Configure.Features
}
}
}
単体テストを介してハンドラーを実行しようとすると、もちろんテストは異常終了し、エラーがスローされます。「crash = 5 / zero」のハンドラーにブレーク ポイントを設定してプロジェクトを再実行すると、NServiceBus がメッセージを再配信しようとすると、第 2 レベルの再試行が行われず、未配信のメッセージが直接エラーキュー。