2017-09-16 10 views
0

私は、複数のサービスにわたって活動を編成するために、大量輸送中のサガを使用して調査しています。サーガの生涯は短く、すべてがうまくいくならば2秒以下です。masstransit deferred in sagas

私の場合、クライアントがコマンドを要求し、サガがそのコマンドを処理し、メッセージが受信されて最終的に最初のコマンドに応答するような状態変更を行う要求/応答アプローチを使用したいと思います。サガを開始し、その時点でクライアントはレスポンスを受け取り、サガの結果を表示することができます。

私が見ることができるところから、この点では、コンテキストはもはや最初の要求を認識していません。この方法で受信したメッセージには、どのように返信できますか?最初のイベントを処理するときに私がサガデータに残すことができるものがありますか?それを使って後で返信しますか?

// client 
var response = await client.Request(requestMessage); 

// saga 
During(SomeState, 
    When(RequestReceived) 
     .Then(...) 
     .Respond(c => MakeResponseMessage(c)) 
     .TransitionTo(Whatever) 
) 

要求を処理するときにあなたが応答することができます:

答えて

0

ありがとうアレクセイ。私は、元のメッセージのResponseAddressとRequestIdを佐賀に保存し、後でSend()を構築できることに気がつきました。

応答

var responseEndpoint = await ctx.GetSendEndpoint(responseAddress); 
await responseEndpoint.Send(message, c => c.RequestId = requestId); 
送信元の要求

MassTransit.EntityFrameworkIntegration.Saga.EntityFrameworkSagaConsumeContext<TSagaData, TMessage> payload; 

    if (ctx.TryGetPayload(out payload)) 
    {     
     ResponseAddress = payload.ResponseAddress; 
     RequestId = payload.RequestId ;       
    } 

からの応答の詳細を取得

0

は現在、佐賀のステートマシンにのみ、このような即時応答を行うことができます。

あなたが以前に受け取ったものに応答したい場合は、自分でリクエスト/応答の会話を作成する必要があります。私はあなたがデカップリングされた応答を持っている必要があることを意味するので、あなたはメッセージを送信し、返信メッセージのための完全な消費者を持っている必要があります。これは完全に非同期のビジネスになります。