masstransit延迟回应传奇

时间:2017-09-16 13:15:51

标签: masstransit

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

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

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

2 个答案:

答案 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);