masstransit延迟回应传奇

问题描述 投票:0回答:2

我正在调查在公共交通中使用传单来协调跨多个服务的活动。传奇的生命周期很短 - 如果一切顺利,不到2秒。

对于我的用例,我想使用请求/响应方法,客户端请求命令,saga处理该命令,在收到消息时经历一些状态更改并最终响应发起saga的第一个命令,此时客户端收到响应并可以显示传奇的结果。

从我所看到的,到目前为止,上下文不再了解初始请求。如何回复以这种方式收到的邮件?在处理第一个事件时,我是否可以坚持使用传奇数据,并在以后使用它来回复?

masstransit
2个回答
0
投票

目前,saga状态机只能做这样的立即响应:

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

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

因此,您可以在处理请求时做出响应。

如果您想回复之前收到的内容,则必须自己制作请求/回复对话。我的意思是你必须有一个解耦的响应,所以你需要发送一条消息,并有一个完整的消费者的回复消息。这将是完全异步的业务。


0
投票

谢谢Alexey。我已经意识到我可以在saga上存储原始消息中的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);
© www.soinside.com 2019 - 2024. All rights reserved.