2016-05-12 12 views
2

Das Programm unten ist im Grunde das Programm von Receiver/Worker-Programm aus dem C# Rabbit MQ Tutorial hier: https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html (mit einem Zähler hinzugefügt).RabbitMQ BasicConsume und Event Driven Probleme in Bezug auf Console.ReadLine()

Es gibt zwei oder drei Dinge, die mir davon stapfte haben:

1) Wenn ich die „Console.ReadLine()“ kommentieren Sie es verbraucht die Nachrichten aus der Warteschlange und zeigt:

Start 
Press [enter] to exit. 
My End - CountMessagesProcessed=0 

Die ersten paar Male, die ich getestet habe, konnte ich nicht herausfinden, was los war.

2) Diese Zeile erscheint nie in der Ausgabe: Console.WriteLine ("Drücken Sie [Enter] zum Beenden.") ;. Vermutlich weil es vor der "Console.ReadLine();" steht, aber warum? Was ist das Zusammenspiel zwischen dem ReadLine-Event und dem BasicConsumer?

3) Die MQ-Tutorial-Seite sagt, dass CNTL-C den "Listener" -Prozess stoppen soll, aber ich finde, dass das Drücken von Enter gleich gut funktioniert.

Ich habe bereits Listener für MQSeries geschrieben, mit Threading, die mir vielleicht besser gefallen, aber ich versuche nur die grundlegenden Tutorials zu verstehen.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading.Tasks; 
using RabbitMQ.Client; 
using RabbitMQ.Client.Events; 

namespace RabbitMQReceiver 
{ 
    class Receive 
    { 
     public static void Main(string[] args) 
     { 
      var factory = new ConnectionFactory() { HostName = "localhost" }; 
      var myQueuename = "MyQueueName1"; 
      Console.WriteLine("My Start"); 


      using (var connection = factory.CreateConnection()) 
      using (var channel = connection.CreateModel()) 
      { 
       channel.QueueDeclare(queue: myQueuename, 
            durable: false, 
            exclusive: false, 
            autoDelete: false, 
            arguments: null); 

       var consumer = new EventingBasicConsumer(channel); 
       int countMessagesProcessed = 0; 

       // this chunk of code is passed as parm/variable to BasicConsume Method below to process each item pulled of the Queue 
       consumer.Received += (model, ea) => 
       { 
        var body = ea.Body; 
        var message = Encoding.UTF8.GetString(body); 
        countMessagesProcessed++; 
        Console.WriteLine(" [x] Received {0}", message); 
       } 

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

       Console.WriteLine(" Press [enter] to exit."); // this line never shows up in output 
       Console.ReadLine(); // if this line is commented out the message are consumed, but no Console.WriteLines appear at all. 
       Console.WriteLine("My End - CountMessagesProcessed=" + countMessagesProcessed); 

      } 
     } 
    } 
} 

Antwort

1

Console.ReadLine() stoppt die Ausführung des Programms an diesem Punkt, während eine Eingabe wartet, die die Fäden RabbitMQ ermöglicht wird mit in der Zwischenzeit laufen. Auskommentiert läuft die Programmausführung bis zum Ende und endet, einschließlich der RabbitMQ-Threads.

Ja, Sie können alles eingeben und es wird die Ausführung des Programms anhalten; Sobald Sie die Taste drücken, wird die Programmausführung fortgesetzt und bis zum Ende ausgeführt.