2017-09-16 71 views
0

我正在調查在公共交通中使用傳奇來編排跨多項服務的活動。這個傳奇的生命是短暫的 - 如果一切順利,不到2秒。masstransit在傳奇中推遲迴復

對於我的使用情況下,我想用請求/響應方式,從而使客戶端請求命令,佐賀處理該命令,通過一些狀態變化都按收到的消息,並最終響應第一命令發起了傳奇,在這一點上客戶收到迴應,並可以顯示傳奇的結果。

從我所看到的情況來看,在這一點上,上下文不再意識到最初的請求。我如何回覆以這種方式收到的消息?在處理第一個事件時,我是否可以堅持傳奇數據,然後用它來回答?

回答

0

謝謝阿列克謝。我意識到我可以將原始消息中的ResponseAddress和RequestId存儲在傳說中,然後再構造一個Send()。

獲取從原始請求

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

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

響應細節發送所述響應

var responseEndpoint = await ctx.GetSendEndpoint(responseAddress); 
await responseEndpoint.Send(message, c => c.RequestId = requestId); 
0

目前,佐賀狀態機只能做這樣的即時響應:

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

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

這樣你就可以處理一個請求時作出迴應。

如果你想回應你以前收到的東西,你將不得不自己制定請求/響應對話。我的意思是你必須有分離的響應,所以你需要發送一條消息,並有一個完整的消費者的回覆消息。這將是完全異步的業務。