我正在学习使用来自 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