首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用者在MassTransit RouterSlip中引发异常时,为什么Compensate方法不调用

当使用者在MassTransit RouterSlip中引发异常时,为什么Compensate方法不调用
EN

Stack Overflow用户
提问于 2020-07-12 14:59:26
回答 1查看 60关注 0票数 0

我在一个saga状态机中构建了一个路由器slip:

代码语言:javascript
运行
复制
var builder = new RoutingSlipBuilder(NewId.NextGuid());
            var submitOrderUrl = QueueNames.GetActivityUri(nameof(SubmitOrderActivity));
            builder.AddActivity("SubmitOrder", submitOrderUrl, new
            {
                context.Message.OrderId
            });;
            builder.AddActivity("Payment", QueueNames.GetActivityUri(nameof(PaymentActivity)), new {
                context.Message.OrderId,
                context.Message.CustomerId,
                context.Message.Credit
            });
           
            builder.AddActivity("TakeProduct", QueueNames.GetActivityUri(nameof(TakeProductActivity)), new
            {
                context.Message.OrderId,
                Baskets
            });
            builder.AddVariable("OrderId", context.Message.OrderId);
            var routingSlip = builder.Build();
            await context.Execute(routingSlip);

我有TakeProductActivity活动:公共类TakeProductActivity : IActivity:...

代码语言:javascript
运行
复制
 public async Task<ExecutionResult> Execute(ExecuteContext<TakeProductArgument> context)
        {
            logger.LogInformation($"Take Product Courier called for order {context.Arguments.OrderId}");            
            var uri = QueueNames.GetMessageUri(nameof(TakeProductTransactionMessage));
            var sendEndpoint = await context.GetSendEndpoint(uri);
            await sendEndpoint.Send<TakeProductTransactionMessage>(new
            {
                ProductBaskets = context.Arguments.Baskets                
            });
             
            return context.Completed(new { Baskets = context.Arguments.Baskets, OrderId=context.Arguments.OrderId });
        }

当我使用sendEndpoint.Send()方法(fire & forget)时,当服务发生异常时,compensate方法不会自动激活,但当我使用requestClient.GetResponse (request/reply)方法调用服务时,当发生异常时会自动调用Compensate方法。在PaymentConsumer中,当抛出异常时,必须调用支付补偿方法,但它没有!

代码语言:javascript
运行
复制
///this class has implemented in another micro-service hosted separate process:
public class TakeProductTransactionConsumer : IConsumer<TakeProductTransactionMessage>
....
 public async Task Consume(ConsumeContext<TakeProductTransactionMessage> context)
        {
            if(context.Message.ProductBaskets.Count>0)
             { 
                    throw new Exception("Process Failed!");
             }
            logger.LogInformation($"Take product called ");
         
            Dictionary<int, int> productCounts = new Dictionary<int, int>();
            foreach (var item in context.Message.ProductBaskets)
            {
                productCounts.Add(item.ProductId, item.Count);
            }
            var products = await productService.TakeProducts(productCounts);
            await publishEndpoint.Publish<ProductsUpdatedEvent>(new
            {
                ProductUpdatedEvents = products.Select(p =>new { ProductId = p.Id,p.Price,p.Count}).ToList()
            });
           
            
        }

问题是MassTransit无法从rabbitMQ获取异常并自动调用compensate方法。当路由器slip活动中抛出异常时,我应该如何告诉MassTransit调用compensate

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-12 19:59:46

如果您的Take Product活动使用Send to fire- and -forget to the take product服务,并且该服务抛出异常,则该活动将永远不会知道它,因为它已经完成。即发即忘,在目标服务中没有观察到异常。

如果您希望take产品活动在take产品服务抛出异常时失败,则需要使用request/response来观察来自该服务的异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62858041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档