使用C#从RabbitMQ的队列中获取单个消息的代码

时间:2019-07-25 12:15:37

标签: rabbitmq

如何使用C#从RabbitMQ中的队列接收单个消息

我正在使用RabbitMQ维护我的队列。当我阅读队列消息时,它会显示队列中存在的所有消息。

我要按照“先出先出”标准来检索一条消息。

请提供给我代码,以使用RabbitMQ从队列中获取单个消息

var connection = connectionFactory.CreateConnection();
        var channel = connection.CreateModel();
        // accept only one unack-ed message at a time
        // uint prefetchSize, ushort prefetchCount, bool global
        channel.BasicQos(0, 1, false);
        MessageReceiver messageReceiver = new MessageReceiver(channel);
        channel.BasicConsume("viewer_Queues", false, messageReceiver);
        //channel.QueueDeclare("viewer_Queues", false, false, false, null);
        var consumer = new QueueingBasicConsumer(channel);
        channel.BasicConsume("viewer_Queues", true, consumer);
        BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
        var body = ea.Body;
        var message = Encoding.UTF8.GetString(body);
        Console.WriteLine(message + " Received.");
        Console.ReadLine();

1 个答案:

答案 0 :(得分:0)

我认为您需要在worker Queues部分的Tutorials网站上找到类似的东西:

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

 class Worker
 {
  public static void Main()
  {
    var factory = new ConnectionFactory() { HostName = "localhost" };
    using(var connection = factory.CreateConnection())
    using(var channel = connection.CreateModel())
    {
        channel.QueueDeclare(queue: "task_queue",
                             durable: true,
                             exclusive: false,
                             autoDelete: false,
                             arguments: null);

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

        Console.WriteLine(" [*] Waiting for messages.");

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] Received {0}", message);

            int dots = message.Split('.').Length - 1;
            Thread.Sleep(dots * 1000);

            Console.WriteLine(" [x] Done");

            channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
        };
        channel.BasicConsume(queue: "task_queue",
                             autoAck: false,
                             consumer: consumer);

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }
}

}`

如果您一次只想收到一封邮件,并且可以在官方网站https://www.rabbitmq.com/

上阅读,则prefetch参数非常重要。
相关问题