繁体   English   中英

Console.WriteLine 不适用于 consumer.received - RabbitMQ C#

[英]Console.WriteLine is not working on consumer.received - RabbitMQ C#

我写了这些代码行,但我不知道如何在consumer.receive的控制台上打印一些值。 此代码有效,因为我检查了 RabbitMQ CloudAMQP 上的一些值,但我在控制台上看不到任何更改。

问题在这里:

Console.WriteLine(Encoding.UTF8.GetString(e.Body.ToArray()) + " received");

完整代码:

 // publisher
 ConnectionFactory factory = new ConnectionFactory();
 factory.Uri = new Uri("amqps://guest:guest@localhost");
 
 using (IConnection connection = factory.CreateConnection())
 using (IModel channel = connection.CreateModel())
 {
      channel.ExchangeDeclare("kuyruk", type: ExchangeType.Fanout);

      for (int i = 1; i <= 100; i++)
      {
         byte [] bytemessage = Encoding.UTF8.GetBytes($"is - {i}");
 
         IBasicProperties properties = channel.CreateBasicProperties();
         properties.Persistent = true;
 
         channel.BasicPublish(exchange: "kuyruk", routingKey: "", basicProperties: properties, body: bytemessage);
     }     
 }
 
 // Consumer
 ConnectionFactory factory = new ConnectionFactory();
 factory.Uri = new Uri("amqps://guest:guest@localhost");
 
 using (IConnection connection = factory.CreateConnection())
 using (IModel channel = connection.CreateModel())
 {
     channel.ExchangeDeclare("kuyruk", type: ExchangeType.Fanout);
 
     // Here consumer İçin Oluşturulacak Kuyruklara Random İsim Oluşturma
     string queueName = channel.QueueDeclare().QueueName;
     channel.QueueBind(queue: queueName, exchange: "kuyruk", routingKey: "");
 
     channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

     EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
     channel.BasicConsume(queueName, false, consumer);
     consumer.Received += (sender, e) =>
     {
         Thread.Sleep(500);
         Console.WriteLine(Encoding.UTF8.GetString(e.Body.ToArray()) + " received");
         channel.BasicAck(e.DeliveryTag, false);
     };

     Console.Read();     
 }

首先,您必须创建队列。 当您在此之后发布消息时,它将被排队。 如果先发布消息,消息就会消失,因为没有队列可以发送消息。

您代码中的另一个错误是:您正在创建消费者渠道。 您定义消息到达时要采取的操作。 然后,当您的代码遇到下面的发布过程时,您退出包装消费者渠道的 using 块。 为此,consumer 是关闭的,不能消费消息。

//consumer

using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost")
};

using (IConnection connection = factory.CreateConnection())
using (IModel consumeChannel = connection.CreateModel())
{
    consumeChannel.ExchangeDeclare("kuyruk", type: ExchangeType.Fanout);

    //#region Her Consumer İçin Oluşturulacak Kuyruklara Random İsim Oluşturma
    string queueName = consumeChannel.QueueDeclare().QueueName;
    consumeChannel.QueueBind(queue: queueName, exchange: "kuyruk", routingKey: "");
    //#endregion

    consumeChannel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

    var consumer = new EventingBasicConsumer(consumeChannel);
    consumeChannel.BasicConsume(queueName, false, consumer);
    consumer.Received += (sender, e) =>
                         {
                             Thread.Sleep(500);
                             Console.WriteLine(Encoding.UTF8.GetString(e.Body.ToArray()) + " recieved");
                             consumeChannel.BasicAck(e.DeliveryTag, false);
                         };

    //publisher
    using (IModel publishChannel = connection.CreateModel())
    {
        publishChannel.ExchangeDeclare("kuyruk", type: ExchangeType.Fanout);
        for (int i = 1; i <= 100; i++)
        {
            var str = $"is - {i}";
            byte[] byteMessage = Encoding.UTF8.GetBytes(str);

            IBasicProperties properties = publishChannel.CreateBasicProperties();
            properties.Persistent = true;

            publishChannel.BasicPublish(exchange: "kuyruk", routingKey: "", basicProperties: properties, body: byteMessage);
        }
    }

    Console.Read();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM