我发现没有任何 Masstransit 配置允许在启用重复检测的情况下创建服务总线主题。
你可以很简单地用队列来做到这一点。但是对于Topics来说,这似乎有点神秘。
有人有工作样本吗?
也许不可能。
我一直在尝试使用 Bus.Factory.CreateUsingAzureServiceBus 方法提供的 IServiceBusBusFactoryConfigurator。
我原以为使用 IServiceBusBusFactoryConfigurator.Publish 方法和 IServiceBusBusFactoryConfigurator.SubscriptionEndpoint 方法可以完成任务,但经过无数次试验后,我没有找到解决方案。
答案 0 :(得分:1)
要配置具有重复检测的消息类型主题,您必须在生产者和消费者中都配置发布拓扑(每个总线实例只需要配置一次,但如果您的生产者是单独的总线实例,它将还需要配置)。该主题也必须不存在,因为一旦在 Azure 中创建它就不会更新。
配置发布拓扑:
namespace DupeDetection
{
public interface DupeCommand
{
string Value { get; }
}
}
var busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.Publish<DupeCommand>(x => x.EnableDuplicateDetection(TimeSpan.FromMinutes(10)));
cfg.ReceiveEndpoint("dupe", e =>
{
e.Consumer<DupeConsumer>();
});
}
消费者正常(无需特殊设置)。
class DupeConsumer :
IConsumer<DupeCommand>
{
public Task Consume(ConsumeContext<DupeCommand> context)
{
return Task.CompletedTask;
}
}
<块引用>
我添加了一个单元测试来验证这种行为,并且可以确认当具有相同 MessageId
的两条消息背靠背发布时,只有一条消息传递给消费者。
测试日志输出:
10:53:15.641-D Create send transport: sb://masstransit-build.servicebus.windows.net/MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection/DupeCommand
10:53:15.784-D Topic: MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection/DupeCommand (dupe detect)
10:53:16.375-D SEND sb://masstransit-build.servicebus.windows.net/MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection/DupeCommand dc3a0000-ebb8-e450-949c-08d8e8939c7f MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection.DupeCommand
10:53:16.435-D SEND sb://masstransit-build.servicebus.windows.net/MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection/DupeCommand dc3a0000-ebb8-e450-949c-08d8e8939c7f MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection.DupeCommand
10:53:16.469-D RECEIVE sb://masstransit-build.servicebus.windows.net/MassTransit.Azure.ServiceBus.Core.Tests/input_queue dc3a0000-ebb8-e450-949c-08d8e8939c7f MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection.DupeCommand MassTransit.IConsumer<MassTransit.Azure.ServiceBus.Core.Tests.DupeDetection.DupeCommand>(00:00:00.0017972)
您可以看到主题声明中显示的 (dupe detect)
属性。
答案 1 :(得分:0)
这是我最终找到的解决方案。它不依赖于尝试任何 ReceiveEndpoint 或 SubscriptionEndpoint 配置方法,这些方法似乎从来没有给我想要的东西。
Generic struct 'Unmanaged' requires that 'ContentView' be a class type