2015-04-24 2 views
0

С example в rabbitmq потребитель получает все сообщения из очереди за один раз. Как использовать одно сообщение и выйти?Как использовать одно сообщение?

QueueingConsumer consumer = new QueueingConsumer(channel); 
channel.basicConsume(QUEUE_NAME, true, consumer); 

while (true) { 
    QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
    String message = new String(delivery.getBody()); 
    System.out.println(" [x] Received '" + message + "'"); 
} 
+3

Не используйте петлю. – Kayaman

+0

если не использовать цикл, все потерянные сообщения, кроме одного. – jBee

+0

Разве это не то, что вы хотели? Потребляйте одно сообщение и выходите. – Kayaman

ответ

7

Вы должны объявить basicQos настройки, чтобы получить одно сообщение от времени ACK до NACK статуса и отключения автоматического ACK, чтобы дать подтверждение в явном виде.

ConnectionFactory factory = new ConnectionFactory(); 
    factory.setHost("localhost"); 
    Connection connection = factory.newConnection(); 
    Channel channel = connection.createChannel(); 
    channel.basicQos(1); 
    channel.queueDeclare(QUEUE_NAME, true, false, false, null); 
    System.out.println("[*] waiting for messages. To exit press CTRL+C"); 

    QueueingConsumer consumer = new QueueingConsumer(channel); 
    channel.basicConsume(QUEUE_NAME, consumer); 
    while(true) { 
     QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
     int n = channel.queueDeclarePassive(QUEUE_NAME).getMessageCount(); 
     System.out.println(n); 
     if(delivery != null) { 
      byte[] bs = delivery.getBody(); 
      System.out.println(new String(bs)); 
      //String message= new String(delivery.getBody()); 
      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); 
      //System.out.println("[x] Received '"+message); 
     } 
    } 

Надеюсь, это поможет!

+0

Кроме того, в качестве предостережения к OP: команда RabbitMQ не рекомендуем читать только по одному. Причина: http://www.rabbitmq.com/blog/2011/09/24/sizing-your-rabbits/ – Nav

+1

Я не думаю, что настройка BasicQOS на 1 разрешает его. «Это делается путем установки значения« prefetch count »с использованием метода basic.qos. Значение определяет максимальное количество неподтвержденных поставок, которые разрешены на канале. После того, как число достигнет сконфигурированного счета, RabbitMQ прекратит доставку большего количества сообщений на канал, пока не будет признан хотя бы один из выдающихся. ". С http://www.rabbitmq.com/confirms.html – Nav

0

Используйте AMQP 0.9.1 basic.get, чтобы синхронно получить только одно сообщение.

ConnectionFactory factory = new ConnectionFactory(); 
factory.setUri(uri); 

Connection connection = factory.newConnection(); 
Channel channel = connection.createChannel(); 

channel.queueDeclare(QUEUE_NAME, true, false, false, null); 

GetResponse response = channel.basicGet(QUEUE_NAME, true); 
if (response != null) { 
    String message = new String(response.getBody(), "UTF-8"); 
} 

channel.close(); 
connection.close(); 
Смежные вопросы