rabbitmq MassTransit -通过容器解析使用方时,将使用方分配给两个不同的端点

u59ebvdq  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(150)

我使用的是带有Autofac和RabbitMq的MassTransit 7.3.0。
到目前为止,我满足于我的所有服务对每个服务使用一个队列/端点。
我注册我的消费者基本上是这样的:

builder.AddMassTransit(massTransit =>
{
    mt.AddConsumers(consumerAssembly);

    massTransit.UsingRabbitMq((ctx, cfg) =>
    {
        cfg.Host(config.HostName, "/", h =>
        {
            h.Username(config.Username);
            h.Password(config.Password);
        });
        cfg.ReceiveEndpoint(logicModule.InputQueue, ep => ep.ConfigureConsumers(ctx));
    });
});

然而,现在我需要每个服务具有2个队列,其中第一个队列用于除了少数特殊的消费者之外的大多数消费者,第二个队列用于那些特殊的消费者;第二个队列还需要应用一些设置(DurablePurgeOnStartupAutoDelete),我无法通过消费者定义设置这些设置。
不过,我看不出我怎么能
a)排除特殊消费者被添加到第一队列(因为AddConsumers将仅占用所有),并且排除常规消费者被添加到第二队列
b)将特殊消费者注册到第二队列,同时仍然使用容器来解析它们
更新:我注意到IContainerBuilderBusConfigurator.AddConsumer()有一个方法.Endpoint(),它允许对端点进行有限的配置,所以我尝试将特殊的消费者移到一个不同的程序集中(这样它们就不会与mt.AddConsumers(consumerAssembly)行一起添加),然后像这样手动添加它们

mt.AddConsumer<MySpecialConsumer>().Endpoint(ep => ep.Name="myspecialqueue");

然后设置第二个队列,如下所示:

cfg.ReceiveEndpoint("myspecialqueue", ep =>
{
   ep.ConfigureConsumers(ctx);
   ep.AutoDelete = true;
   ep.PurgeOnStartup = true;
   ep.Durable = false;
});

但是,当我查看RabbitMq时,我仍然看到消费者绑定到第一个队列(logicModule.InputQueue),而不是第二个队列(myspecialqueue)。
我 * 假设 * 这是因为第一个队列(cfg.ReceiveEndpoint(logicModule.InputQueue, ep => ep.ConfigureConsumers(ctx));)的设置已经添加了它们。但是,似乎没有办法排除它们。或者这个路径不正确。

14ifxucb

14ifxucb1#

为什么不添加一个整数角色或任何类型的角色来使消费者变得特殊。例如,您可以在数据库中添加一个ne表。将该表命名为Roles。该表中有两个预设变量:“Normal”和“Special”。Normal=1,Special=2。当消费者被保存时,如果它是普通的,则分配1,如果它是特殊的,则分配2。这样就形成了一个具有标识值的外键主键关系。

相关问题