2015-11-24 3 views
3

Мой вопрос очень похож на этот: RabbitTemplate receive and requeue К сожалению, он был отмечен как ответ, хотя ответ не соответствует моим потребностям.RabbitTemplate получать сообщения и запросы

Я хочу подражать функциональности интерфейса администратора Rabbit Admin, то есть хочу синхронно читать сообщения из очереди, но не хочу, чтобы очередь их потеряла, то есть что-то вроде просмотра.

Ответ здесь RabbitTemplate receive and requeue предлагает использовать прослушиватель, но в этом случае он будет читать и запрашивать бесконечно. Я хочу получить и запросить сообщения только один раз, поэтому, я думаю, я должен использовать RabbitTemplate, а не слушатель.

ответ

4
class Peeker implements ChannelCallback<Message> { 

    final MessagePropertiesConverter propertiesConverter = new DefaultMessagePropertiesConverter(); 

    @Override 
    public Message doInRabbit(Channel channel) throws Exception { 
     GetResponse result = channel.basicGet("someQ", false); 
     if (result == null) { 
      return null; 
     } 
     channel.basicReject(result.getEnvelope().getDeliveryTag(), true); 
     return new Message(result.getBody(), propertiesConverter.toMessageProperties(
       result.getProps(), result.getEnvelope(), "UTF-8")); 
    } 
} 
Peeker peeker = new Peeker(); 


... 


Message peek = this.rabbitTemplate.execute(peeker); 
+1

@GarryRussel, хорошо выглядит. Но как я могу получить N сообщений (или все сообщения)? Должен ли я вызвать basicGet в цикле, пока не получу нуль? – Ruslan

+2

Да, и вы можете отклонить их всех одним вызовом 'basicNack' (вместо' basicReject') - очевидно, измените тип возврата на 'Collection ' или аналогичный. –

+0

Спасибо большое! Меня устраивает! – Ruslan

Смежные вопросы