2

NServiceBus にエラーを処理させて再試行させるか、アプリケーション内の未知のエラーに対して有効な第 2 レベルの再試行を使用させることを理解しています。

たとえば、 transactionId == null と言うと、例外をスローしたくないだけで、これが余分な試行で通過することは決してないことがわかっているので、NService バスに処理させます。例外シナリオを知っている場合、これが最善の方法は何ですか?

私は、さまざまなエンドポイント (A、B、C、D) を呼び出すサガを使用しています。サガをハング状態にしたくないので、このエンドポイントで上記のエラー シナリオをどのように処理しますか。

4

1 に答える 1

0

再試行の回数が役に立たないことがわかっている例外 (または例外のクラス) がある場合は、正しいです。すぐに失敗するのが最善です。

このようなハンドラーがあるとしましょう..

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 レベルの再試行が行われず、未配信のメッセージが直接エラーキュー。

于 2013-08-30T13:45:13.170 に答える