将 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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)