2015-04-15 3 views
1

Раньше я читал все сообщения, присутствующие в очереди, но теперь мне нужно вернуть определенное количество сообщений на основе выбора (количества) пользователей.Сообщения в ручном режиме в RabbitMQ

Я пытаюсь изменить цикл for соответственно, но его чтение всего сообщения из-за автоматического подтверждения. Поэтому я попытался изменить его на ручной в файле конфигурации.

В моей программе как ack сообщение вручную после прочтения msg (в настоящее время я использую AmqpTemplate для приема, и у меня нет ссылки на канал)?

Properties properties = admin.getQueueProperties("queue_name"); 
    if(null != properties) 
    { 
     Integer messageCount = Integer.parseInt(properties.get("QUEUE_MESSAGE_COUNT").toString());   
     while(messageCount > 0) 
     { 
      Message msg = amqpTemplate.receive(queue_name); 
      String value = new String(msg.getBody()); 

      valueList.add(value); 
      messageCount--; 
     } 
} 

Любая помощь очень заметна, спасибо заранее.

+1

'AmqpTemplate # receive' autoack сообщение, если только канал транслируется. Чтобы контролировать подтверждение, вы можете использовать 'AmqpTemplate # execute' и делать вручную, или лучше всего использовать« SimpleMessageListenerContainer »или даже« BlockingQueueConsumer » –

+0

@NicolasLabrot. Я не нашел метод execute в AmqpTemplate, ссылаетесь ли вы на к чему-то другому. Да, я установил setAcknowledgeMode в MANUAL в SimpleMessageListenerContainer. – lambodar

+0

Извините, я имею в виду 'RabbitTemplate # execute', который является реализацией' AmqpTemplate' –

ответ

7

Вы не можете вручную оценить метод - используйте SimpleMessageListenerContainer для потребителя, управляемого событиями, с РУКОВОДСТВАМИ и ChannelAwareMessageListener. Или используйте метод шаблона execute(), который дает вам доступ к Channel - но тогда вы будете использовать API-интерфейс более низкого уровня RabbitMQ, а не абстракцию Message.

EDIT:

Вы должны изучить лежащую в основе RabbitMQ Java API для использования казнить, но что-то, как это будет работать ...

final int messageCount = 3; 
    boolean result = template.execute(new ChannelCallback<Boolean>() { 

     @Override 
     public Boolean doInRabbit(final Channel channel) throws Exception { 
      int n = messageCount; 
      channel.basicQos(messageCount); // prefetch 
      long deliveryTag = 0; 
      while (n > 0) { 
       GetResponse result = channel.basicGet("si.test.queue", false); 
       if (result != null) { 
        System.out.println(new String(result.getBody())); 
        deliveryTag = result.getEnvelope().getDeliveryTag(); 
        n--; 
       } 
       else { 
        Thread.sleep(1000); 
       } 
      } 
      if (deliveryTag > 0) { 
       channel.basicAck(deliveryTag, true); 
      } 
      return true; 
     } 
    }); 
+0

GaryRussell не могли бы вы указать любой пример кода, как использовать execute(), я очень новичок в этом, и у меня нет большого форума на этом. Спасибо заранее – lambodar

+1

Я отредактировал мою ответ. –

+0

Thanks GaryRussell – lambodar

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