ConsumerDefinition 中忽略了 MassTransit 端点名称

MassTransit endpoint name is ignored in ConsumerDefinition

ConsumerDefinition 文件中的 EndpointName 属性 似乎被 MassTransit 忽略了。我知道正在使用 ConsumerDefinition,因为重试逻辑有效。如何让不同的命令转到不同的队列?似乎我可以让它们全部通过一个中央队列,但我认为这不是命令的最佳实践。

这是我在创建 MassTransit 总线时在启动时执行的应用程序配置。

        Bus.Factory.CreateUsingAzureServiceBus(cfg =>
        {
            cfg.Host(_config.ServiceBusUri, host => {
                host.SharedAccessSignature(s =>
                {
                    s.KeyName = _config.KeyName;
                    s.SharedAccessKey = _config.SharedAccessKey;
                    s.TokenTimeToLive = TimeSpan.FromDays(1);
                    s.TokenScope = TokenScope.Namespace;
                });
            });

            cfg.ReceiveEndpoint("publish", ec =>
            {
                // this is done to register all consumers in the assembly and to use their definition files
                ec.ConfigureConsumers(provider);
            });

以及我在消费者中的处理程序定义(一个 azure worker 服务)

public class CreateAccessPointCommandHandlerDef : ConsumerDefinition<CreateAccessPointCommandHandler>
{
    public CreateAccessPointCommandHandlerDef()
    {
        EndpointName = "specific";
        ConcurrentMessageLimit = 4;
    }

    protected override void ConfigureConsumer(
        IReceiveEndpointConfigurator endpointConfigurator,
        IConsumerConfigurator<CreateAccessPointCommandHandler> consumerConfigurator
    )
    {
        endpointConfigurator.UseMessageRetry(r =>
        {
            r.Immediate(2);
        });
    }
}

在我发送消息的应用程序中,我必须将其配置为发送到 "publish" 队列,而不是 "specific"。

EndpointConvention.Map<CreateAccessPointsCommand>(new Uri($"queue:specific")); // does not work
EndpointConvention.Map<CreateAccessPointsCommand>(new Uri($"queue:publish")); // this does work

因为您是自己配置接收端点,并将其命名为 publish,这就是接收端点。

要使用定义配置端点,请使用:

cfg.ConfigureEndpoints(provider);

这将使用容器中注册的定义来配置接收端点,使用定义的消费者端点名称。

这在documentation中也有解释。