繁体   English   中英

在C#中,如何处理队列中当前的所有RabbitMQ消息?

[英]In C#, how can I process all RabbitMQ messages currently on the queue?

基本的RabbitMQ教程提供了有关如何从队列中连续检索消息的示例:

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. 如果我在下午1点启动代码,则要处理下午1点之前放在队列中的所有消息。

要么

  1. 如果我在13:00:00开始我的代码,并且我的代码运行需要10秒钟,那么我不介意它是否包含放在13:00:00和13:00:10之间的队列中的消息,因为只要队列为空就停止。

我意识到我可以在消息中添加时间戳并进行检查,或者我可以摆弄超时值,但是我想知道是否有任何内置方法可以正确执行此操作。

提前致谢。

从评论看来,RabbitMQ似乎不是用于批处理的,因此它并不是为此目的而设计的。

我还注意到,当测试DequeueNoWait方法或尝试以零超时进行出队时,它们根本不起作用,只是返回null。

以下解决方案使用QueueDeclare来获取现有消息的计数,并且不需要时间戳或错误超时:

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

        var consumer = new QueueingBasicConsumer(channel);
        channel.BasicConsume(Constants.QueueName, true, consumer);

        Console.WriteLine(" [*] Processing existing messages.");

        for (int i = 0; i < queueDeclareResponse.MessageCount; i++)
        {
            var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] Received {0}", message);
        }
        Console.WriteLine("Finished processing {0} messages.", queueDeclareResponse.MessageCount);
        Console.ReadLine();
    }
}

你可以做什么:

1.)首先向消息对象添加时间戳

2.)如果时间戳无效,则拒绝该消息。 它是rabbitmq的集成功能

参考

暂无
暂无

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

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