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