【问题标题】:MassTransit Courier resends activity after a whileMassTransit Courier 在一段时间后重新发送活动
【发布时间】:2021-06-09 01:08:15
【问题描述】:

我通过一系列活动实现了路由单。其中之一在 Azure 中执行长时间运行的过程,甚至需要 15-20 分钟。我注意到 10 分钟后,虽然进程仍在运行,但活动再次执行。它打破了整个路由滑动,因为第一个进程仍在进行中,重试会产生错误。

我使用 Azure 服务总线作为消息代理。我在文档中找不到对此主题的任何引用,所以我想知道这是否特定于 Courier 并且可以更改以使其根本不重新交付,或者这是某种不正确的行为?

编辑:

修改后的代码如下:

services.AddMassTransit(c =>
{
    c.SetEndpointNameFormatter(new DefaultEndpointNameFormatter(false));

    c.AddConsumersFromNamespaceContaining<TestConsumer>();

    c.AddActivitiesFromNamespaceContaining<ActivityBase<IArguments, LogBase>>();
    
    c.UsingAzureServiceBus((ctx, cfg) =>
    {
        cfg.Host(hostContext.Configuration.GetConnectionString("connection_string"));
        
        cfg.LockDuration = TimeSpan.FromMinutes(25);
        cfg.MaxAutoRenewDuration = TimeSpan.FromMinutes(25);
        cfg.MaxDeliveryCount = 1;
        
        cfg.ConfigureEndpoints(ctx);
    });
});

【问题讨论】:

    标签: c# .net-core masstransit


    【解决方案1】:

    由于使用消息所需的时间长度,该消息很可能由 Azure 服务总线重新传递。

    在接收端点上,MaxAutoRenewDuration 用于调整更新消息锁的最长时间,直接传递给 Azure 客户端库。默认值为五分钟,与默认LockDuration 相同。您可以将此时间增加到活动完成的最大预期时间。

    (可选)您可以将MaxDeliveryCount 属性更改为 1,这样 Azure 只会尝试传递消息一次,之后如果锁定超时并且没有更新,它会将消息移动到死区-该接收端点的信件队列。

    更新:如果您在活动定义中进行配置,您可以如下所示进行:

    public class CustomActivityDefinition :
        ActivityDefinition<TActivity, TArguments, TLog>
    {
        protected override void ConfigureExecuteActivity(IReceiveEndpointConfigurator endpointConfigurator, IExecuteActivityConfigurator<TActivity, TArguments> executeActivityConfigurator)
        {
            if(endpointConfigurator is IServiceBusReceiveEndpointConfigurator sb)
            {
                sb.MaxDeliveryCount = 1;
                sb.MaxAutoRenewDuration = TimeSpan.FromMinutes(67);
            }
        }
    }
    

    【讨论】:

    • 我在问题中插入了代码。它仍然没有像预期的那样工作,10 分钟后我仍然得到了重新交付的活动。我必须使用cfg.ReceiveEndpoint() 还是可以修改此配置以便我仍然可以使用cfg.ConfigureEndpoints(ctx) 代替?
    • 您可以创建一个配置执行/补偿端点的活动definition(派生自ActivityDefinition&lt;,,&gt;,未显示)。 AddActivities... 方法将在命名空间中找到它们并在配置端点时应用它们。
    • 您能给我看一些代码示例,说明如何在该定义中配置端点吗?我在文档中找不到任何东西,我什至不知道我应该在构造函数中还是通过覆盖 ConfigureExecuteActivity 方法来做。我也尝试使用 Intellisense 找到这些选项,但这也无济于事。
    • 我没有想到这种配置,但现在它按预期工作了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多