3

以下のプログラムは基本的に、こちらの C# Rabbit MQ チュートリアルの Receiver/Worker プログラムのプログラムです: https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html (カウンターが追加されています)。

私がそれについて困惑したことが2つまたは3つあります。

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 に答える