首页 > 解决方案 > 将 saga 的响应关联回请求者

问题描述

我正在学习使用来自 Masstransit 的 automatonymous,它是一个很棒的框架。但是,我在使用 saga 实现请求/响应时遇到了一些问题。我的用例就像非常标准的订单流程。

一些代码:

我向传奇提出这样的请求:

private readonly IRequestClient<PayOrder> _payOrder;
var request = new PayOrder(id, paymentRequest);
var response = await _payOrder.GetResponse<OrderPayment, TransitionNotAllowed, OrderNotFound>(
                request, cancellationToken);

然后在 saga 中,配置如下所示:

During(Created,
    When(Pay)
        .Request(
            CreateTransaction, 
            ctx => ctx.Init<CreateTransaction>(new CreateTransaction
            {
                OrderId = ctx.Instance.CorrelationId, 
                ...
            }))
        .TransitionTo(CreateTransaction!.Pending)
        
During(CreateTransaction!.Pending,
    When(CreateTransaction.Completed)
        .Then(OnTransactionCreated)
        .TransitionTo(Paying)
        .Respond(c => c.Instance.Payments.Last()),
    When(CreateTransaction.Faulted)
        .TransitionTo(Created));
    
private void OnTransactionCreated(BehaviorContext<OrderSaga, TransactionCreated> context)
{
    context.Instance.Payments.Add(new OrderPayment()
    {
        TransactionId = context.Data.Response.TransactionId
    });
}

在两者之间还有一个消费者创建实际交易并成功返回。获取消费者响应并触发 CreateTransaction.Completed 并且 saga 转换为 Paying。但是,响应永远不会出现在我的 requestclient 中。

同样在输出日志中,我看到 OrderPayment 消息已发送到总线,但由于某种原因,我一直在 requestclient 中遇到超时,所以不知何故,响应与该客户端没有关联,我不知道为什么。

[20:51:24 DBG] Declare exchange: name: Core.Models:OrderPay
ment, type: fanout, durable
[20:51:24 DBG] SEND rabbitmq://localhost/Core.Models:OrderP
ayment db800000-358d-74d4-c2eb-08d91c896ee0 Core.Models.Ord
erPayment

标签: c#message-queuemasstransitsagaautomatonymous

解决方案


推荐阅读