Попытка ПОЛУЧИТЬ сообщение кролика без подтверждения, но безуспешно

У меня есть задача, в которой я пытаюсь получить все сообщения в очереди кролика. Мне нужно только ПОЛУЧАТЬ, а не ПОТРЕБЛЯТЬ. Итак, вот код, который я использую

def some_function_name() :
    connection = rabbitObj.get_connection()
    channel = rabbitObj.get_channel(connection)
    while True : 
        method_frame, header_frame, body = channel.basic_get(queue='error_queue', no_ack=False)
        if method_frame:
            #do some work
        else :
             break #breaking the loop

while(True):
    some_function_name()

когда я запускаю этот код, он работает правильно, в первый раз. Я получаю все сообщения в очереди, и все сообщения остаются в состоянии «Готово», но когда я запускаю цикл во второй раз, все сообщения переходят в состояние «Неподтверждено».

Требование: каждый раз я должен получать только сообщения GET, и они не должны оставаться неподтвержденными.

Первый цикл:

Первый цикл

Второй цикл:

введите здесь описание изображения

Может ли кто-нибудь помочь мне, что я делаю неправильно, или какие изменения я должен внести.

Заранее спасибо :)

Изменить 1: Что касается ответа @BarrensZeppelin, все сообщения будут потеряны, если я установлю no_ack=True. Посмотрите на скриншот ниже: введите здесь описание изображения


person kadamb    schedule 12.09.2017    source источник


Ответы (2)


Когда вы устанавливаете no_ack=False, вы специально указываете брокеру ожидать ответа, поэтому все сообщения становятся неподтвержденными. Попробуйте установить no_ack=True.

person BarrensZeppelin    schedule 12.09.2017
comment
В этом случае все сообщения теряются. Добавление соответствующего скриншота для этого случая. - person kadamb; 12.09.2017
comment
Ага, так вы хотите просмотреть очередь. Это не поддерживается в RabbitMQ, но есть обходные пути. Взгляните на этот вопрос: a-dequeue" title="используя rabbitmq, есть ли способ просмотреть содержимое очереди без удаления из очереди"> stackoverflow.com/questions/4700292/ - person BarrensZeppelin; 12.09.2017
comment
Как вы думаете, в RabbitMQ нет действия GET. На самом деле вы поглощаете все сообщения. Проще говоря: basic_consume предназначен для эффективного использования нескольких сообщений подряд и блокируется до тех пор, пока сообщения не станут доступными, basic_get всегда возвращает одно сообщение (если доступно, иначе None). - person BarrensZeppelin; 12.09.2017

У меня есть обходной путь, и он работает. Закрытие соединения кролика после потребления сделало свое дело (хотя теперь требуется время, чтобы каждый раз создавать и закрывать соединение)

def some_function_name() :
    connection = rabbitObj.get_connection()
    channel = rabbitObj.get_channel(connection)
    while True : 
        method_frame, header_frame, body = channel.basic_get(queue='error_queue', no_ack=False)
        if method_frame:
            #do some work
        else :
             break #breaking the loop
    rabbitObj.close_connection(connection)

while(True):
    some_function_name()
person kadamb    schedule 12.09.2017
comment
Вместо этого вы можете использовать basic_cancel, это должно позволить вам использовать то же соединение. - person BarrensZeppelin; 12.09.2017