如何为AzureServiceBus主题配置RequiresDuplicateDetection

问题描述

我正在尝试将ASB主题上的$answers = AnswerVersion::query()->with('answer') ->whereHas('answer.project',function ($query) use ($project) { $query->where('project_id',$project->id); }); 属性配置为true,但是似乎没有遵循主RequiresDuplicateDetection上的设置:

IServiceBusFactoryConfigurator

在ASB上为此订阅创建的任何主题似乎都不符合该设置。我发现了一种(也许很怪异的)方法,可以通过钩住我消息类型的 var busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg => { cfg.Host("ASB_ConnectionString"); cfg.SubscriptionEndpoint<ExtractionRequest>("Test",e => { e.LockDuration = TimeSpan.FromMinutes(1); e.MaxAutoRenewDuration = TimeSpan.FromMinutes(5); e.AutoDeleteOnIdle = TimeSpan.FromHours(1); }); cfg.RequiresDuplicateDetection = true; }); 上的TopicDescription对象来实现。

PublishTopology

此替代方法后正确创建的主题。如果任何人都可以对此有所了解,那就太好了。

解决方法

您可以在总线配置器中配置主题的发布拓扑:

cfg.Publish<ExtractionRequest>(x => x.RequiresDuplicateDetection = true);

您应该先配置拓扑,然后再配置订阅端点,在这种情况下,订购尤其重要。

在您的示例中,指定cfg.RequiresDuplicateDetection = true;仅配置总线接收端点,而不配置订阅端点或任何其他已配置的接收端点。