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