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

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

【问题讨论】:

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

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


【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      相关资源
      最近更新 更多