2014-11-11 1 views
3

Я хочу прочитать полезную нагрузку или messageId из непризнанных сообщений в очереди RabbitMQ. Это возможно?Как читать непризнанные сообщения RabbitMQ/цикл RabbitMQ

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

  1. Установите TTL сообщения в очередь задержки как частоту времени, необходимо периодически. Может иметь разные сообщения с различными TTL для разных целей работы;
  2. положить сообщение в очередь ожидания. Когда сообщение истекает, оно переиздается в рабочую очередь. Сообщение может находиться в рабочей очереди столько, сколько необходимо, пока потребитель не будет потреблять его.
  3. Один потребитель берет сообщение и обрабатывает его. Если обработка завершается успешно, потребитель должен подтвердить рабочую очередь, а затем записать сообщение обратно в очередь задержки; Если обработка завершается с ошибкой (например, сбой потока), подтверждение не выполняется. Затем сообщение будет автоматически появляться в рабочей очереди автоматически. Тогда другой потребитель может заняться этой работой. Когда сообщение, отправленное обратно в очередь ожидания, снова истекло, оно переиздается, затем повторно потребляется потребителем ...... Создан цикл, распределена рабочая нагрузка.

Я хочу, чтобы в цикле не было отсутствующих или повторяющихся сообщений, так как я не хочу отсутствовать или выполнять двойную работу одновременно. Тем не менее, есть крошечные крошечные случайные повторяющиеся сообщения. Ниже показано, что потребитель сначала пишет сообщение для задержки очереди и подтверждает рабочую очередь. Если поток сработает прямо между двумя строками, сообщение будет находиться в очереди ожидания, а Кролик снова опубликует сообщение в рабочей очереди. В конечном итоге дублируются сообщения в цикле.

channel.basicPublish(DELAY_EXCHANGE, "", null, message.getBytes()); 
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); 

Для предотвращения выше, я хочу, чтобы добавить собаку смотреть логику после того, как выше две строки:

  1. Проверьте общее количество сообщений в цикле (общее количество сообщений в обоих очередях), чтобы понять, являются ли он равен моему ожидаемому числу (я ожидал, что число меньше 10);

  2. Если число не совпадает, я хочу выяснить, какой из них отсутствует или какой-либо дубликат, а затем справиться с ним. Меня не волнует последовательность этих сообщений, или частота была нарушена, так как это действительно очень важный вопрос. Я могу легко получить те сообщения, которые готовы и требуют их. Но проблема в том, как бороться с этими непризнанными сообщениями?

спасибо, что заблаговременно!

Рой

ответ

2

Это невозможно читать неподтвержденные сообщения из другого контекста оригинальных сообщения, сгорели и провели в ун-aked.

+0

Большое спасибо за ответ. Я подробно изложил свой первоначальный вопрос. Не могли бы вы взглянуть? Thx снова! –

+0

Не стоит так много менять вопрос, пока он выглядит совершенно новым. – pinepain

+0

Правда. Извините! –