Я хочу использовать сагу masstransit в своем проекте ядра .net, но я не смог найти ни документации, ни (лучших практик) примеров для обработки исключений.
Если у меня возникла ошибка в моем потребителе, должен ли я опубликовать какое-либо сбойное событие и использовать его. На самом деле я не думаю, что это хорошее решение. Поэтому я хочу бросить исключение и поймать в Masstransit Statemachine.
OrderReceivedConsumer.cs
public class OrderReceivedConsumer : IConsumer<IOrderReceivedEvent>
{
public async Task Consume(ConsumeContext<IOrderReceivedEvent> context)
{
var orderCommand = context.Message;
await Console.Out.WriteLineAsync($"Order code: {orderCommand.OrderCode} Order id: {orderCommand.OrderId} is received.");
//do something..
throw new Exception("test");
//await context.Publish<IOrderProcessedEvent>(
// new { CorrelationId = context.Message.CorrelationId, OrderId = orderCommand.OrderId });
}
}
OrderSaga.cs
public class OrderSaga : MassTransitStateMachine<OrderSagaState>
{
public State Received { get; set; }
public State Processed { get; set; }
public Event<IOrderCommand> OrderCommand { get; set; }
public Event<IOrderProcessedEvent> OrderProcessed { get; set; }
public OrderSaga()
{
InstanceState(s => s.CurrentState);
Event(() => OrderCommand,
cec =>
cec.CorrelateBy(state => state.OrderCode, context => context.Message.OrderCode)
.SelectId(selector => Guid.NewGuid()));
Event(() => OrderProcessed, cec => cec.CorrelateById(selector =>
selector.Message.CorrelationId));
Initially(
When(OrderCommand)
.Then(context =>
{
context.Instance.OrderCode = context.Data.OrderCode;
context.Instance.OrderId = context.Data.OrderId;
})
.ThenAsync(
context => Console.Out.WriteLineAsync($"{context.Data.OrderId} order id is received..")
)
.TransitionTo(Received)
.Publish(context => new OrderReceivedEvent(context.Instance))
);
During(Received,
When(OrderProcessed)
.ThenAsync(
context => Console.Out.WriteLineAsync($"{context.Data.OrderId} order id is processed.."))
.Finalize()
);
SetCompletedWhenFinalized();
}
}
Где мне использовать метод "поймать" библиотеку автоматов?