RabbitMQ basic.get и подтверждение - PullRequest
       47

RabbitMQ basic.get и подтверждение

0 голосов
/ 21 октября 2011

Я вызываю:

GetResponse response = channel.basicGet("some.queue", false); // no auto-ack
....
channel.basicAck(deliveryTag, ...);

Однако, когда я вызываю basicGet, сообщения в очереди остаются в «Готово», а не в «Неподтвержденном». Я хочу, чтобы они были в неподтвержденном виде, чтобы я мог либо basic.ack их (исключая их из очереди), либо basic.nack их

Ответы [ 2 ]

4 голосов
/ 13 января 2014

Я делаю следующее, чтобы имитировать Задержка подтверждения :

Во время потребления

  1. Получить (использовать) сообщение из начальной очереди.
  2. Создание очереди «PendingAck_123456».123456 - это уникальный идентификатор сообщения.Задайте следующие свойства
    • x-message-ttl (для запроса после истечения времени ожидания)
    • x-expires (чтобы убедиться, что временная очередь будетбыть удаленным)
    • x-dead-letter-exchange и x-deal-letter-routing-key до требование к исходной очереди по истечении TTL.
  3. Опубликовать сообщение, ожидающее подтверждения в этой очереди "PendingAck_123456"
  4. Подтвердить сообщение, чтобы удалить его из начальной очереди

Во время подтверждения

  1. Вычисление имени очереди из идентификатора сообщения и получение из очереди "PendingAck_123456"
  2. Подтверждение (не нужно звонить .getBody()).Это удалит его из этой ожидающей очереди, и TTL не сможет его запросить

Замечания

  • Очередь только для 1 сообщения. Это проблема, если есть много таких очередей?
  • Требуемое сообщение будет отправлено на входной стороне очереди ... не на выходной очереди (как это было бы при реальной проверке).в порядке сообщений.
  • Сообщение копируется приложением в очередь ожидания. Это дополнительный шаг, который может повлиять на общую производительность.
  • Чтобы имитировать Nack / Reject,Вы можете скопировать сообщение в исходную очередь и получить его из очереди PendingAck.По умолчанию TTL сделает это (позже).
2 голосов
/ 24 октября 2011

При выполнении ack сразу после get все работает нормально.Однако в моем случае они были разделены запросом.А шаблон Spring закрывает канал и соединение при каждом исполнении.Таким образом, есть три варианта:

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

В первых двух случаях вы можете 'сделать это с пружиной RabbitTemplate

...