用于自动生成启用重复检测的 Azure 服务总线主题的 Masstransit(非 DI)配置

时间:2021-03-16 15:25:58

标签: masstransit

我发现没有任何 Masstransit 配置允许在启用重复检测的情况下创建服务总线主题。

你可以很简单地用队列来做到这一点。但是对于Topics来说,这似乎有点神秘。

有人有工作样本吗?

也许不可能。

我一直在尝试使用 Bus.Factory.CreateUsingAzureServiceBus 方法提供的 IServiceBusBusFactoryConfigurator。

我原以为使用 IServiceBusBusFactoryConfigurator.Publish 方法和 IServiceBusBusFactoryConfigurator.SubscriptionEndpoint 方法可以完成任务,但经过无数次试验后,我没有找到解决方案。

2 个答案:

答案 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