masstrtransit -当消费者通过容器解析时,将消费者分配到两个不同的端点



我正在使用MassTransit 7.3.0与Autofac和RabbitMq。

到目前为止,我满足于所有服务都使用单个队列/端点。

我基本上是这样注册我的消费者的:

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个队列,其中第一个队列用于大多数消费者,除了少数特殊的消费者,第二个队列用于那些特殊的消费者;第二个队列还需要应用一些设置(Durable,PurgeOnStartupAutoDelete),我不能通过消费者定义设置。

但是,我不知道我怎么能

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));)的设置已经添加了它们。然而,似乎没有办法将它们排除在外。或者这个路径不是正确的

为什么不添加一个整数角色或任何类型的角色来让消费者变得特别呢?例如,您可以向数据库中添加一个新表。将表命名为Roles。本表有两个预设变量:"normal"、"normal"、"special"。正常= 1,特殊= 2。当消费者被保存时,如果它是普通的赋值为1,如果它是特殊的赋值为2。因此是一个具有标识值的外键主键关系。

最新更新