2016-06-29 19 views
0

"ファンアウト"交換タイプを使用してパブリッシュ/サブスクライブを実装するサンプルコードを使用しています。しかし、下のコードのように、サブスクライバは公開されている 'Hello Word'メッセージを表示していません。RabbitMQ Pub/Subサブスクライバはメッセージを受信できません

Publisher.cs

var factory = new ConnectionFactory() { HostName = "localhost" }; 
     using (var connection = factory.CreateConnection()) 
     using (var channel = connection.CreateModel()) 
     { 
      channel.ExchangeDeclare(exchange: "logs", type: "fanout"); 

      var message = GetMessage(args); 
      var body = Encoding.UTF8.GetBytes(message); 
      channel.BasicPublish(exchange: "logs", 
           routingKey: "", 
           basicProperties: null, 
           body: body); 
      Console.WriteLine(" [x] Sent {0}", message); 
     } 

     Console.WriteLine(" Press [enter] to exit."); 
     Console.ReadLine(); 
    } 

    private static string GetMessage(string[] args) 
    { 
     return ((args.Length > 0) 
       ? string.Join(" ", args) 
       : "info: Hello World!"); 
    } 

Subscriber.cs

var factory = new ConnectionFactory() { HostName = "localhost" }; 
     using (var connection = factory.CreateConnection()) 
     using (var channel = connection.CreateModel()) 
     { 
      channel.ExchangeDeclare(exchange: "logs", type: "fanout"); 

      var queueName = channel.QueueDeclare().QueueName; 
      channel.QueueBind(queue: queueName, 
           exchange: "logs", 
           routingKey: ""); 

      Console.WriteLine(" [*] Waiting for logs."); 

      var consumer = new EventingBasicConsumer(channel); 
      consumer.Received += (model, ea) => 
      { 
       var body = ea.Body; 
       var message = Encoding.UTF8.GetString(body); 
       Console.WriteLine(" [x] {0}", message); 
      }; 
      channel.BasicConsume(queue: queueName, 
           noAck: true, 
           consumer: consumer); 

      Console.WriteLine(" Press [enter] to exit."); 
      Console.ReadLine(); 
     } 

コード参考:https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html

+0

どのようなエラーが表示されますか?これはあなたが提供したリンクとまったく同じコードですか? – cantSleepNow

+0

@cantSleepNow:いいえ、何もエラーが発生していません。パブリッシャ用の2つのコンソールアプリケーションとsubscriber.so用の2つのコンソールアプリケーションを作成しました。最初にパブリッシャアプリケーションを実行してからサブスクライバを実行しています。 – Dev

+0

パブリッシャーよりも最初のサブスクライバを試してみるとどうなりますか? – cantSleepNow

答えて

1

あなたはそれが実際に動作考え出したとして、あなただけに必要最初に加入者を起動します。どうして?答えはあなたが提供したリンクにもあります。私はここで一つの部分を引用します:

しかし、私たちのロガーの場合はそうではありません。我々はすべてのログ メッセージについて、それらのサブセットだけでなく、聞きたいと思っています。我々はまた、 に現在興味のあるメッセージは、古いメッセージではないです。それを解決するには、2つのこと が必要です。

まず、ウサギに接続するたびに、新しい空のキューが必要です。 これを行うには、ランダムな名前のキューを作成するか、さらには の方が良いでしょう。サーバーがランダムなキュー名を選択させるようにします。

第2に、消費者を切断すると、キューは が自動的に削除されます。

これは基本的にキューは、あなたが加入者を起動し、唯一のその時点で、交換が実際にメッセージを入れるキューを持っている場合にのみ作成されることを意味します。あなたは拳Publisherを起動しているので、何のキューはありませんメッセージが最後に届くようにしてください。

関連する問題