Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MassTransit快递员在一段时间后重新发送活动_C#_.net Core_Masstransit - Fatal编程技术网

C# MassTransit快递员在一段时间后重新发送活动

C# MassTransit快递员在一段时间后重新发送活动,c#,.net-core,masstransit,C#,.net Core,Masstransit,我通过一系列活动实现了路由单。其中一个在Azure中执行长时间运行的过程,甚至需要15-20分钟。我注意到,10分钟后,当进程仍在运行时,活动将再次执行。它打破了整个路由错误,因为第一个进程仍在进行中,重试会产生错误 我正在使用Azure Service Bus作为消息代理。我在文档中找不到任何关于此主题的参考,因此我想知道这是否是针对快递员的,是否可以进行更改,使其完全不重新交付,或者这是一种不正确的行为 编辑: 以下是更改后的代码: services.AddMassTransit(c =&g

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

我正在使用Azure Service Bus作为消息代理。我在文档中找不到任何关于此主题的参考,因此我想知道这是否是针对快递员的,是否可以进行更改,使其完全不重新交付,或者这是一种不正确的行为

编辑:

以下是更改后的代码:

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);
    });
});
services.AddMassTransit(c=>
{
c、 SetEndpointNameFormatter(新的DefaultEndpointNameFormatter(false));
c、 AddConsumersFromNamespaceContaining();
c、 AddActivitiesFromNamespaceContaining();
c、 使用AzuReserveCebus((ctx,cfg)=>
{
主机(hostContext.Configuration.GetConnectionString(“连接字符串”);
cfg.LockDuration=TimeSpan.FromMinutes(25);
cfg.MaxAutoRenewDuration=从分钟开始的时间跨度(25);
cfg.MaxDeliveryCount=1;
配置端点(ctx);
});
});

由于使用消息所需的时间长度,Azure Service Bus可能正在重新传递消息

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

或者,您可以将
MaxDeliveryCount
属性更改为1,以便Azure只尝试传递消息一次,之后如果锁超时且未续订,它将将消息移动到该接收端点的死信队列

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

公共类CustomActivityDefinition:
活动定义
{
受保护的覆盖无效配置ExecuteActivity(IReceiveEndpointConfigurator endpointConfigurator、IExecuteActivityConfigurator executeActivityConfigurator)
{
if(endpointConfigurator为IServiceBusReceiveEndpointConfigurator sb)
{
sb.MaxDeliveryCount=1;
sb.MaxAutoRenewDuration=从分钟开始的时间跨度(67);
}
}
}

我在问题中插入了代码。它仍然没有像预期的那样工作,10分钟后我仍然得到了活动的重新交付。我是否必须使用
cfg.ReceiveEndpoint()
,或者是否可以修改此配置,以便我仍然可以使用
cfg.ConfigureEndpoints(ctx)
?您可以创建一个配置执行/补偿端点的活动(源自
ActivityDefinition
,未显示)。这些活动。。。方法将在名称空间中找到它们,并在配置终结点时应用它们。您能否向我展示一些代码示例,说明如何在该定义中配置终结点?我在文档中找不到任何内容,甚至不知道是应该在构造函数中还是通过重写
ConfigureExecuteActivity
方法来完成。我还尝试使用Intellisense查找这些选项,但也没有帮助。我更新了答案。我没有想到这种配置,但现在它按预期工作,谢谢!