在C#中的Rabbitmq中读取队列中消息的最佳方法

时间:2018-07-11 13:02:50

标签: c# .net rabbitmq message-queue amqp

我开始学习RabbitMQ。我找到了一些有关如何使用队列消息的Internet教程。但是我想知道如何最好的方法。今天,我在计时器内部使用了一个简单的代码,如果存在则返回一条消息并执行一些工作。其他示例正在使用while true循环,如下面的代码。在Rabbitmq中是否存在某些功能来注册在特定队列中发布消息时触发的方法回调?我不想检查是否存在,并且如果还有其他方法可以在while true循环内获取消息。谢谢。

var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
    using (var channel = connection.CreateModel())
    {
        channel.QueueDeclare("hello", false, false, false, null);

        var consumer = new QueueingBasicConsumer(channel);
        channel.BasicConsume("hello", true, consumer);

        Console.WriteLine(" [*] Waiting for messages." +
                                 "To exit press CTRL+C");
        while (true)
        {
            var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] Received {0}", message);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我相信您正在寻找的是EventingBasicConsumer。在后台,这个使用者要做的是运行一个后台线程,该线程运行一个循环,将任何消息插入一个临时的阻塞队列中。然后,一个单独的线程将阻塞队列中的每条消息作为事件分发给使用者。

有关更多详细信息,请参见.net API guide