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

时间:2013-06-09 01:21:09

标签: rabbitmq synchronous

有没有办法使用单个同步调用接收多条消息?

当我知道队列中有N条消息(N可能是小于10的小值)时,我应该可以执行类似channel.basic_get(String queue,boolean autoAck,int numberofMsg)的操作。我不想向服务器发出多个请求。

4 个答案:

答案 0 :(得分:8)

RabbitMQ basic.get不支持多条消息as seen in the docs。检索多条消息的首选方法是使用basic.consume,它会将消息推送到客户端,避免多次往返。 acks是异步的,因此您的客户端不会等待服务器响应。 basic.consume还有一个好处,即如果客户端断开连接,允许RabbitMQ重新传递消息,basic.get无法做到。也可以关闭此功能,同时将no-ack设置为true

设置basic.qos prefetch-count将设置随时推送到客户端的邮件数。如果客户端没有等待消息(将立即返回),客户端库往往会阻塞可选的超时。

答案 1 :(得分:3)

您可以使用QueueingConsumer Consumer接口的实现,它允许您在单个请求中检索多条消息。

 QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
 channel.basicConsume(plugin.getQueueName(), false, queueingConsumer);

 for(int i = 0; i < 10; i++){
    QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(100);//read timeout in ms
    if(delivery == null){
      break;
    }
 }

答案 2 :(得分:1)

首先声明QueueingBasicConsumer()的实例,它包装模型 从模型执行model.BasicConsume(QueueName,false,consumer)
然后实现一个循环,它将循环来自队列的消息,然后处理
下一行 - consumer.Queue.Dequeue()方法 - 等待从队列接收消息 然后将字节数组转换为字符串并显示它 Model.BasicAck() - 从队列中释放消息以接收下一条消息
然后在服务器端可以开始等待下一条消息通过:

  public string GetMessagesByQueue(string QueueName)
    {
        var consumer = new QueueingBasicConsumer(_model);
        _model.BasicConsume(QueueName, false, consumer);

        string message = string.Empty;

        while (Enabled)
        {
            //Get next message
            var deliveryArgs = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

            //Serialize message
             message = Encoding.Default.GetString(deliveryArgs.Body);
                _model.BasicAck(deliveryArgs.DeliveryTag, false);
        }
        return message;
    }

答案 3 :(得分:0)

这不是一个很好的解决方案,也不能解决多次调用的问题,但是您可以使用MessageCount方法。例如:

  bool noAck = false;
  var messageCount = channel.MessageCount("hello");
  BasicGetResult result = null;
  if (messageCount == 0)
  {
      // No messages available
  }
  else
  {
      while (messageCount > 0)
      {
          result = channel.BasicGet("hello", noAck);
          var message = Encoding.UTF8.GetString(result.Body);
          //process message .....
          messageCount = channel.MessageCount("hello");
      }
相关问题