如何解决一段时间后,MassTransit Courier 重新发送活动
我通过一系列活动实现了路由单。其中之一在 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);
});
});
解决方法
由于使用消息所需的时间长度,消息很可能由 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);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。