Масстранзит саги с исключениями - PullRequest
2 голосов
/ 05 апреля 2019

Я хочу использовать сагу 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();
        }
    }

Где мне использовать метод "поймать" библиотеку автоматов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...