我正在调查在公共交通中使用传单来协调跨多个服务的活动。传奇的生命周期很短 - 如果一切顺利,不到2秒。
对于我的用例,我想使用请求/响应方法,其中客户端请求命令,saga处理该命令,在收到消息时经历一些状态更改并最终响应启动的第一个命令传奇,此时客户端收到响应,并可以显示传奇的结果。
从我所看到的,到目前为止,上下文不再了解初始请求。如何回复以这种方式收到的邮件?在处理第一个事件时,我是否可以坚持使用传奇数据,并在以后使用该事件进行回复?
答案 0 :(得分:0)
目前,saga状态机只能做这样的立即响应:
// client
var response = await client.Request(requestMessage);
// saga
During(SomeState,
When(RequestReceived)
.Then(...)
.Respond(c => MakeResponseMessage(c))
.TransitionTo(Whatever)
)
因此,您可以在处理请求时作出回应。
如果您想回复之前收到的内容,则必须自行制作请求/回复对话。我的意思是你必须有一个解耦的响应,所以你需要发送一条消息,并有一个完整的消费者的回复消息。这将是完全异步的业务。
答案 1 :(得分:0)
谢谢Alexey。我已经意识到我可以在传奇上存储原始消息中的ResponseAddress和RequestId,然后再构建一个Send()。
从原始请求中获取响应详细信息
MassTransit.EntityFrameworkIntegration.Saga.EntityFramework
SagaConsumeContext<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);