Я учусь использовать autoonymous от Masstransit, и это отличная структура. Однако у меня есть некоторые проблемы с реализацией запроса/ответа с использованием саги. Мой вариант использования похож на довольно стандартный процесс заказа.
Некоторый код:
Делаю запрос к саге так:
private readonly IRequestClient<PayOrder> _payOrder;
var request = new PayOrder(id, paymentRequest);
var response = await _payOrder.GetResponse<OrderPayment, TransitionNotAllowed, OrderNotFound>(
request, cancellationToken);
Тогда в саге конфигурация выглядит так:
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, и сага переходит в 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