禁用循环模式并在MassTransit上使用扇出

问题描述 投票:3回答:1

我创建了一个基本的演示pub / sub应用程序,它可以在带有MassTransit的localhost上运行。

我想要实现的是发布消息,所有订阅者都应该收到消息。

目前,在我的环境中,我启动了一个发布者应用和两个订阅者应用。但是当我发布消息时,订阅者轮流收到消息。

我认为扇出交换类型是默认的?但它适用于循环模式。

我补充道

config.ExchangeType = ExchangeType.Fanout;

明确地,但消费者仍然一个接一个地收到消息......

我的酒吧/子代码:

发布:

var bus = Bus.Factory.CreateUsingRabbitMq(config =>
{
  config.Host(new Uri("rabbitmq://localhost/"), h => { });
  config.ExchangeType = ExchangeType.Fanout;
});
var busHandle = bus.Start();
bus.Publish<SomethingHappened>(message);

订阅者使用此代码:

var bus = Bus.Factory.CreateUsingRabbitMq(config =>
{
  var host = config.Host(new Uri("rabbitmq://localhost/"), h => { });
  config.ReceiveEndpoint(host, "MassTransitExample_Queue", e => e.Consumer<SomethingHappenedConsumer>());
});

var busHandle = bus.Start();
Console.ReadKey();
busHandle.Stop();
c# rabbitmq masstransit
1个回答
6
投票

阅读下面的文章时,我发现队列名称必须是唯一的

https://www.maldworth.com/2015/10/27/masstransit-send-vs-publish/

构建总线并注册端点时:sbc.ReceiveEndpoint(...),必须确保queueName参数是唯一的。

所以我的订阅者代码现在看起来像这样:

var bus = Bus.Factory.CreateUsingRabbitMq(config =>
{
  var host = config.Host(new Uri("rabbitmq://localhost/"), h => { });
  config.ReceiveEndpoint(host, "MTExQueue_" + Guid.NewGuid().ToString(), e => e.Consumer<SomethingHappenedConsumer>());
});

var busHandle = bus.Start();
Console.ReadKey();
busHandle.Stop();
© www.soinside.com 2019 - 2024. All rights reserved.