2016-05-12 73 views
2

下面的程序基本上是来自C#Rabbit MQ教程中的Receiver/Worker程序的程序:https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html(添加了计数器)。RabbitMQ BasicConsume和事件驱动的与Console.ReadLine()相关的问题

有迹象表明,已经难倒我关于它的两三件事:

1)如果我注释掉“到Console.ReadLine()”它消耗从队列中的消息,并显示:

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

我测试的前几次,我无法弄清楚发生了什么事。

2)该行从不在输出中显示:Console.WriteLine(“按[enter]退出。”);.大概是因为它在“Console.ReadLine();”之前,但是为什么? ReadLine事件和BasicConsumer之间的相互作用是什么?

3)MQ教程页面声称使用CNTL-C来停止“侦听器”进程,但是我发现只要按下回车键就可以很好地工作。

我以前用线程编写过MQSeries的监听器,我可能会更喜欢它,但只是想了解提供的基本教程。

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

      } 
     } 
    } 
} 

回答

1

Console.ReadLine()在这一点上暂停程序的执行,同时等待输入,允许RabbitMQ的使用,以在此期间运行的线程。注释掉,程序执行运行到最后并退出,包括RabbitMQ线程。

是的,你可以键入任何东西,它会停止执行程序;一旦你点击了键,程序执行将继续并运行到最后。