3

下面的程序基本上是来自 C# Rabbit MQ 教程的 Receiver/Worker 程序的程序:https ://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html (添加了一个计数器)。

有两三件事让我难过:

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

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

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

2) 此行永远不会出现在输出中:Console.WriteLine(" Press [enter] to exit.");。大概是因为它在“Console.ReadLine();”之前,但为什么呢?ReadLine 事件和 BasicConsumer 之间的相互作用是什么?

3) MQ 教程页面说使用 CNTL-C 停止“侦听器”进程,但我发现只需按 Enter 即可。

我以前用线程编写过 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);

            }
        }
    }
}
4

2 回答 2

1

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

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

于 2016-06-24T12:06:02.240 回答
0

不要使用 Console.ReadLine(),而是使用 Thread.Sleep(Timeout.Infinite),这样您的主程序(或主线程)不会立即退出。它也适用于在 Linux 上运行 netcore rabbitmq。

于 2021-03-24T05:56:57.010 回答