Rabbitmq 使用 .NET 使用单个同步调用检索多条消息

Posted

技术标签:

【中文标题】Rabbitmq 使用 .NET 使用单个同步调用检索多条消息【英文标题】:Rabbitmq retrieve multiple messages using single synchronous call using .NET 【发布时间】:2015-11-25 08:44:58 【问题描述】:

有没有办法使用 .NET 使用单个同步调用来接收多条消息? 我见过question 并找到了java 类com.rabbitmq.client.QueueingConsumer,但我还没有在.NET 命名空间中找到这样的客户端类(RabbitMQ.Client、RabbitMQ.Client.Events)

【问题讨论】:

您能否详细描述一下“单个同步调用”的含义? 嗯,更正确:我想接收一个带有一批消息的事件(将客户端配置为最大批量大小和超时)。希望这个解释更清楚 我就是这么想的。消息批处理通常与正确的设计实践背道而驰。如果您发现需要批处理,也许您想改用共享数据库? 【参考方案1】:

您可以使用BasicQoS.PrefetchCount 检索任意数量的消息:

var model = _rabbitConnection.CreateModel();
// Configure the Quality of service for the model. Below is how what each setting means.
// BasicQos(0="Dont send me a new message untill I’ve finshed",  _fetchSize = "Send me N messages at a time", false ="Apply to this Model only")
model.BasicQos(0, fetchSize, false);

注意:如果您设置 fetchSize = 20,那么它将检索当前在队列中的前 20 条消息。但是,一旦队列被清空,它不会等待 20 条消息在队列中建立,它会尽快开始消耗它们,最多一次 20 个。

希望这是有道理的。

【讨论】:

【参考方案2】:

感谢您的回答,但我找到了我要找的课程:RabbitMQ.Client.QueueingBasicConsumer 简单的实现是:

IEnumerable<T> Get(int maxBatchCount, int getMessageTimeout, int getBatchTimeout)

    var result = new List<T>();
    var startTime = DateTime.Now;
    while (result.Count < maxBatchCount)
    
        var deliverEventArgs = new BasicDeliverEventArgs();
        if ((_consumer as QueueingBasicConsumer).Queue.Dequeue(GetMessageTimeout, out deliverEventArgs))
        
            var entry = ContractSerializer.Deserialize<T>(deliverEventArgs.Body);
            result.Add(entry);
            _queue.Channel.BasicAck(deliverEventArgs.DeliveryTag, false);
        
        else
            break;

        if ((DateTime.Now - startTime) >= TimeSpan.FromMilliseconds(getBatchTimeout))
            break;
    
    return result;

当然,你可以用Environment.TickCount代替DateTime.Now

【讨论】:

以上是关于Rabbitmq 使用 .NET 使用单个同步调用检索多条消息的主要内容,如果未能解决你的问题,请参考以下文章

Springboot项目使用Rabbitmq同步调用

7.RabbitMQ RFC同步调用

springboot | Rabbitmq 实现RPC方式 远程同步调用

springboot | Rabbitmq 实现RPC方式 远程同步调用

如何在 .Net 中使用不同类型的消费者使用 RabbitMq 消息?

在 ASP.Net Core 3 中使用 Rabbitmq 的 RPC