2017-07-07 12 views
0

私は出版社を持っており、rabbitmq:// localhost/test123キューにメッセージを発行しています。 1つのメッセージはTestMessageタイプで、もう1つはTestMessage2タイプです。Masstransit + RabbitMQ。 2つの異なるメッセージタイプの間で1つのキューを共有する

出版社の設定:

sbc.UseRabbitMq(r => r.ConfigureHost(new MessageUrn("rabbitmq://localhost/test123"), c => { })); 
sbc.UseLog4Net(); 
sbc.UseJsonSerializer(); 
sbc.EnableMessageTracing(); 
sbc.ReceiveFrom(new MessageUrn("rabbitmq://localhost/test123")); 

私は、メッセージの種類ごとに2人のseprate消費者(2つの消費者)、消費者1があります。

//config stuff 
    sbc.ReceiveFrom("rabbitmq://localhost/test678?prefetch=20"); 
    sbc.Subscribe(subs => { subs.Handler<TestMessage>(msg => { Logger.Info(msg.Text); }); }); 

消費者2:

//config stuff 
sbc.ReceiveFrom("rabbitmq://localhost/test678"); 
      sbc.Subscribe(
       subs => 
       { 
        subs.Handler<TestMessage2>(
         msg => { Logger.Info(String.Format("rcv:txt= {0}, number= {1}", msg.Text, msg.Number)); }); 
       }); 

だから私をパブリッシャーを停止してコンシューマーの1つを実行すると、彼は自分のタイプのすべてのメッセージを消費し、他をエラーキューに移動します。 test678のExchangeには両方のタイプのバインディングがあります。

2人のコンシューマが他のメッセージをエラーキューに移動している間にメッセージを読み取ろうとするのは正常な動作ですか?興味のあるタイプの異なる消費者の間で1つのキューを共有できないのはなぜですか?

は、事前に

おかげで(私はそれがRabbitMQの設計上の考慮事項や制限はなくmasstransit問題ではないと考えています)。

答えて

1

複数のサービスバスインスタンスが同じキューから受信している場合は、そのサービスバスインスタンスに登録されているコンシューマが同じであることを確認する必要があります。それ以外の場合、サービスによって消費されたメッセージは、そのサービスインスタンス上のコンシューマーのないメッセージタイプの_errorキューに移動されます。

+0

非常にありがとう、クリス。もう1つ質問:キュー(この場合はrabbitmq)が消費者にメッセージを送信するためですか?したがって、消費者がこのメッセージタイプを処理する方法を知らない場合、消費者はそれをエラーキューに移動します。私は、消費者側からのポーリングがあれば、そのような状況は避けることができると信じています... – Sharov

+1

RMQはメッセージタイプを区別しないので、ポーリングなどの問題はありません。 –

関連する問題