2016-10-20 10 views
0

私はRabbitMqを.NETで学んでいます。 tutorialによると、消費者の最も簡単な実装は次のようになります。C# RabbitMq:メソッドリファクタリングが機能を停止しますか?

public class Receive 
{ 
    public static void Main() 
    { 
    var factory = new ConnectionFactory() { HostName = "localhost" }; 
    using(var connection = factory.CreateConnection()) 
    using(var channel = connection.CreateModel()) 
    { 
     channel.QueueDeclare(queue: "hello", 
          durable: false, 
          exclusive: false, 
          autoDelete: false, 
          arguments: null); 

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

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

そして、それは正常に動作します。しかし、私はそれをリファクタリングしたい:別の方法で受信機の機能を定義してみましょう。 )

public class Recieve 
{ 
    private ConnectionFactory factory; 
    public void ConsumeSimpleMessage(string queueName = "default") 
    { 
     using(var connection = factory.CreateConnection()) 
     { 
      using(var channel = connection.CreateModel()) 
      { 
       channel.QueueDeclare(queue: queueName, durable: false, 
        exclusive: false, autoDelete: false, arguments: null); 
       var consumer = new EventingBasicConsumer(channel); 
       consumer.Received += (model, ea) => 
       { 
        var body = ea.Body; 
        var message = Encoding.UTF8.GetString(body); 
        Console.WriteLine(message); 
       }; 

       channel.BasicConsume(queue: queueName, 
          noAck: true, 
          consumer: consumer); 
      } 
     } 


    } 
    public Recieve(string hostName = "localhost") 
    { 
     factory = new ConnectionFactory() { HostName = hostName }; 
    } 
} 

そして、私はメイン(にこのメソッドを呼び出すしようとすると:それは次のようになります

class Program 
{ 
    static void Main(string[] args) 
    { 
     Recieve reciever = new Recieve(); 

     reciever.ConsumeSimpleMessage(); 

     Console.ReadLine(); 
    } 
} 

ここでは動作しません。それは何も表示されません。ただし、メッセージは削除され、受信されたことを意味します。それはなぜ起こるのですか?私はイベントハンドリングについて知らなかったことはありますか?

+0

デッドレター/エラーキューを確認し、その中に何かがあるかどうか確認できますか? – MindingData

+0

あなたのキュー名はこんにちは? – Joe

答えて

2

使用しないで動作するかどうかを確認してください。または使用するステートメントを使用する場合は、Console.Read()をusingステートメントの内側に入れておきます。接続とチャンネルを開いたままにすることができ、手動で閉じる必要はありません。

本当にデバッグしたい場合、ブレークポイントをconsumer.Receiveに置くことができます。受信したメッセージが残っていないかどうかを確認できます。そうすれば、メッセージがいつ削除されるかを知ることができます。

また、トレースするのが簡単なサーバーに入ってくるすべてのメッセージを記録するので、通常はrabbitmqのトレーサを使用することをお勧めします。

+0

これは、Console.Read()をusingステートメント内に配置した後で正確に動作します。私はここでなぜそれが動作するかについての簡単な説明を見つけましたhttp://stackoverflow.com/questions/37192346/rabbitmq-basicconsume-and-event-driven-issues-relating-to-console-readlineなぜそれを動作させるためにConsole.Read()またはConsole.ReadLine()を呼び出す必要がありますか? –

+0

私は、オブジェクトが処分されているステートメントを使用しているときは、接続とチャネルを作成するために "using"ステートメントを使用しないでください。それが助けになるかもしれない。小さなアプリケーションを使用している場合は、接続とチャネルを開いたままにしておくと、トラフィックが大量に発生することはありません。 –

関連する問題