You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:20:19