NServiceBusのバージョン6より前のバージョンでは、IManageMessageFailures
を使用してメッセージの失敗を管理できました。最初のレベルの再試行が試行された後にメッセージを正常に処理できない場合、シリアライゼーション例外のケースを処理することができます。
特定のタイプの例外を無視するか、エラーキューに他のエラーを返して失敗したメッセージを送信するカスタムFaultManager
を実装する方法は次のとおりです。第1レベルのリタイアはまだ発生し、これは第2レベルのリトライではなくキックインすることに注意してください。
public class IssueOrder : ICommand
{
public bool NotFound { get; set; }
public bool HasFaulted { get; set; }
}
public class OrderHandler : IHandleMessages<IssueOrder>
{
public void Handle(IssueOrder message)
{
if(message.NotFound)
throw new OrderNotFoundException();
if(message.HasFaulted)
throw new ApplicationException();
}
}
public class OrderNotFoundException : Exception
{
}
public class CustomFaultManager : IManageMessageFailures
{
private ISendMessages sender;
private MessageForwardingInCaseOfFaultConfig config;
private BusNotifications notifications;
private static ILog Logger = LogManager.GetLogger<CustomFaultManager>();
public CustomFaultManager(ISendMessages sender, IProvideConfiguration<MessageForwardingInCaseOfFaultConfig> config)
{
this.sender = sender;
this.config = config.GetConfiguration();
}
public void SerializationFailedForMessage(TransportMessage message, Exception e)
{
}
public void ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e)
{
if (e is OrderNotFoundException)
{
//Ignore the exception;
Logger.WarnFormat("OrderNotFoundException was thrown. Ignoring the message Id {0}.", message.Id);
}
else
{
//Check if you have performed enough retries, ultimately send to error queue
SendToErrorQueue(message, e);
}
}
private void SendToErrorQueue(TransportMessage message, Exception ex)
{
message.TimeToBeReceived = TimeSpan.MaxValue;
sender.Send(message, new SendOptions(config.ErrorQueue));
Logger.WarnFormat("Message {0} will was moved to the error queue.", message.Id);
}
public void Init(Address address)
{
}
}
とカスタムFaultManager登録する:NServiceBusのバージョン6では
var config = new BusConfiguration();
//Other configuration code
config.RegisterComponents(c =>
{
c.ConfigureComponent<CustomFaultManager>(DependencyLifecycle.InstancePerCall);
});
をしかし、IManageMessageFailures
インタフェースは廃止されました。バージョン12の新しいRecoverability apiでは、より優れたカスタマイズが可能です。例外を無視/ミュートする直接の方法はありません。そのためには、NServiceBU pipelineにカスタム動作が必要であり、既知の手順の1つのステップ(メッセージがエラーキューに移動される前など)でステップを実行します。
もう少し詳しいことを教えてください。私たちはNsb 5を使用していますが、どのようにすべてのケースを実装できるかわかりません。1)メッセージ隠蔽2)通常のSLR 3)IManageMessageFailuresのSLRなし。 「この拡張機能を有効にすると、第2レベルの再試行は呼び出されません」と表示されます。第2に、「メッセージがエラーキューに移動される前に、どのハンドラがイベントに役立つかはわかりません。ただ、SerializationFailedForMessageとProcessingAlwaysFailsForMessage」しかありません。 – YMC
カスタム障害マネージャの実装方法を示すサンプルをまとめています。私と一緒に抱きしめてください。 –
@YMCはコードがあなたのために働くかどうか見てください。また、NSBドキュメントのWebサイトでv5サンプルを更新します。 –