我正在調查在公共交通中使用傳奇來編排跨多項服務的活動。這個傳奇的生命是短暫的 - 如果一切順利,不到2秒。masstransit在傳奇中推遲迴復
對於我的使用情況下,我想用請求/響應方式,從而使客戶端請求命令,佐賀處理該命令,通過一些狀態變化都按收到的消息,並最終響應第一命令發起了傳奇,在這一點上客戶收到迴應,並可以顯示傳奇的結果。
從我所看到的情況來看,在這一點上,上下文不再意識到最初的請求。我如何回覆以這種方式收到的消息?在處理第一個事件時,我是否可以堅持傳奇數據,然後用它來回答?
我正在調查在公共交通中使用傳奇來編排跨多項服務的活動。這個傳奇的生命是短暫的 - 如果一切順利,不到2秒。masstransit在傳奇中推遲迴復
對於我的使用情況下,我想用請求/響應方式,從而使客戶端請求命令,佐賀處理該命令,通過一些狀態變化都按收到的消息,並最終響應第一命令發起了傳奇,在這一點上客戶收到迴應,並可以顯示傳奇的結果。
從我所看到的情況來看,在這一點上,上下文不再意識到最初的請求。我如何回覆以這種方式收到的消息?在處理第一個事件時,我是否可以堅持傳奇數據,然後用它來回答?
謝謝阿列克謝。我意識到我可以將原始消息中的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);
目前,佐賀狀態機只能做這樣的即時響應:
// client
var response = await client.Request(requestMessage);
// saga
During(SomeState,
When(RequestReceived)
.Then(...)
.Respond(c => MakeResponseMessage(c))
.TransitionTo(Whatever)
)
這樣你就可以處理一個請求時作出迴應。
如果你想回應你以前收到的東西,你將不得不自己制定請求/響應對話。我的意思是你必須有分離的響應,所以你需要發送一條消息,並有一個完整的消費者的回覆消息。這將是完全異步的業務。