我使用的是带有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个队列,其中第一个队列用于除了少数特殊的消费者之外的大多数消费者,第二个队列用于那些特殊的消费者;第二个队列还需要应用一些设置(Durable
、PurgeOnStartup
和AutoDelete
),我无法通过消费者定义设置这些设置。
不过,我看不出我怎么能
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));
)的设置已经添加了它们。但是,似乎没有办法排除它们。或者这个路径不正确。
1条答案
按热度按时间14ifxucb1#
为什么不添加一个整数角色或任何类型的角色来使消费者变得特殊。例如,您可以在数据库中添加一个ne表。将该表命名为Roles。该表中有两个预设变量:“Normal”和“Special”。Normal=1,Special=2。当消费者被保存时,如果它是普通的,则分配1,如果它是特殊的,则分配2。这样就形成了一个具有标识值的外键主键关系。