3

NServiceBus を使用して他のサービスを呼び出すサガを実装しています。NServiceBus がサガ内の例外をどのように処理するかについてはよくわかりません。

サガ内にはハンドラーがあり、そのハンドラーは、元のメッセージ ハンドラーが正常に完了した場合にのみ呼び出される外部サービスを呼び出します。やってもいいですか:

public void Handle(IFooMessage message) 
{
    var message = Bus.CreateInstance<ExternalService.IBarMessage>();
    Bus.Send(message);

    // something bad happens here, exception is thrown
}

または、メッセージが ExternalService に複数回送信されますか? ここの誰かがそれを次のように変更することを提案しています:

// handler in the saga
public void Handle(IFooMessage message) 
{
    // Do something
    var message = Bus.CreateInstance<ISendBarMessage>();
    Bus.SendLocal(message);

    // something bad happens, exception is thrown
}

// a service-level handler
public void Handle(ISendBarMessage message) 
{
    var message = Bus.CreateInstance<ExternalService.IBarMessage>();
    Bus.Send(message);
}

私は実験を行いましたが、最初の方法は問題ないように思えますが、http://docs.particular.net/nservicebus/errors/以外のドキュメントは見つかりません:

例外が NServiceBus インフラストラクチャに到達すると、トランザクション エンドポイントでトランザクションがロールバックされ、メッセージがキューに返され、ユーザー コードが送信または発行しようとしたメッセージも取り消されます

この点を明確にするための助けをいただければ幸いです。

4

1 に答える 1

3

サガからメッセージングを行っていて、Web サービスの呼び出しを行っていない限り、安全です。SendLocal を実行する必要はありません。

于 2012-12-03T10:37:26.647 に答える