2016-09-19 1 views
1

MassTransitでlocalhostで動作する基本的なデモpub/subアプリケーションを作成しました。ラウンドロビンパターンを無効にし、MassTransitでファンアウトを使用する

私が達成したいのは、メッセージを公開することです。すべてサブスクライバはメッセージを受け取る必要があります。

現時点では、自分の環境では、1つのパブリッシャーアプリと2つのサブスクライバーアプリを開始します。しかし、私がメッセージを公開すると、加入者はメッセージを交互に受信します。

ファンアウト交換タイプがデフォルトであると思いましたか?ただし、ラウンドロビンパターンが適用されます。

私は明示的に

config.ExchangeType = ExchangeType.Fanout; 

を追加しましたが、消費者はメッセージ一つまだ1を受け取る...

マイパブ/サブコード:

は公開:

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(); 

答えて

2

私は、キュー名は一意である必要がありますことを見出したの下に記事を読ん

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(); 
関連する問題