MassTransit Courier活动抛异常未触发补偿的问题排查
MassTransit Courier路由单补偿逻辑未触发问题排查
我在使用MassTransit Courier路由单功能时遇到补偿逻辑不触发的问题:
- 已实现FullFill消费者,添加了两个Activity
- 第一个
GlobalGeneticsRawDataEditGroupActivity执行逻辑正常,且实现了补偿方法 - 第二个
GlobalAnalyticsEditGroupActivity通过context.FaultedWithVariables抛出测试异常,同样实现了补偿方法 - 已在MassTransit配置中设置2次重试,但第二个Activity抛异常后,第一个已完成Activity的补偿逻辑未触发,控制台无补偿输出
FullFill消费者代码
public class FullFillHerdGroupEditConsumer : IConsumer<IFullFillHerdGroupEditMessage> { public async Task Consume(ConsumeContext<IFullFillHerdGroupEditMessage> context) { Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(" start Fullfill consumer"); var builder = new RoutingSlipBuilder(NewId.NextGuid()); Console.WriteLine("1 - Global raw data Herd Group Edit Activity"); builder.AddActivity("GlobalRawDataGroupEdit", new Uri("queue:GlobalGeneticsRawDataEditGroup_execute"), new { newGroupTitle = context.Message.GroupTitle, oldGroupTitle = context.Message.oldGroupTitle }); Console.WriteLine("2 - Global Analytics Herd Group Edit Activity"); builder.AddActivity("GlobalAnalyticsGroupEdit", new Uri("queue:GlobalAnalyticsEditGroup_execute"), new { GroupId = context.Message.GroupId, GroupTitle = context.Message.GroupTitle, oldGroupTitle = context.Message.oldGroupTitle }); var routingSlip = builder.Build(); await context.Execute(routingSlip); } }
第一个Activity代码(GlobalGeneticsRawDataEditGroupActivity)
public class GlobalGeneticsRawDataEditGroupActivity : IActivity<IGlobalGeneticsRawDataEditGroupArgument, IGeneticsRawDataEditGroupLog> { public async Task<CompensationResult> Compensate(CompensateContext<IGeneticsRawDataEditGroupLog> context) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"[ rawdata ] : Compensate rawdata Edit Group Activity roleback to ( {context.Log.oldGroupTitle} ) from ( {context.Log.newGroupTitle} )"); return context.Compensated(); } public async Task<ExecutionResult> Execute(ExecuteContext<IGlobalGeneticsRawDataEditGroupArgument> context) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"[ rawdata ] : Execute rawdata Edit Group Activity Edit to ( {context.Arguments.newGroupTitle} ) from ( {context.Arguments.oldGroupTitle} )"); return context.Completed(); } } public interface IGeneticsRawDataEditGroupLog { public string newGroupTitle { get; set; } public string oldGroupTitle { get; set; } } public interface IGlobalGeneticsRawDataEditGroupArgument { public string newGroupTitle { get; set; } public string oldGroupTitle { get; set; } }
第二个Activity代码(GlobalAnalyticsEditGroupActivity)
public class GlobalAnalyticsEditGroupActivity : IActivity<IGlobalAnalyticsEditGroupArgument, IGlobalAnalyticsEditGroupLog> { public async Task<CompensationResult> Compensate(CompensateContext<IGlobalAnalyticsEditGroupLog> context) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($"[ Global Analytics ] : Compensate Edit Group Activity roleback to ( {context.Log.oldGroupTitle} ) from ( {context.Log.GroupTitle} ) "); return context.Compensated(); } public async Task<ExecutionResult> Execute(ExecuteContext<IGlobalAnalyticsEditGroupArgument> context) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine($"[ Global Analytics ] : Execute Edit Group Activity Edit to ( {context.Arguments.GroupTitle} ) from ( {context.Arguments.oldGroupTitle} )"); if (true) { return context.FaultedWithVariables(new InvalidOperationException("This is a Test Exception....!"), new { GroupTitle = context.Arguments.GroupTitle, oldGroupTitle = context.Arguments.oldGroupTitle }); } return context.Completed(); } } public interface IGlobalAnalyticsEditGroupArgument { public string GroupTitle { get; set; } public string oldGroupTitle { get; set; } } public interface IGlobalAnalyticsEditGroupLog { public string GroupTitle { get; set; } public string oldGroupTitle { get; set; } }
内容的提问来源于stack exchange,提问作者Rouzbeh Zarandi
相关产品推荐
相关产品推荐

