Как проверить, нет ли сообщения в RabbitMQ с Pika и Python

Я читаю сообщения от RabbitMQ с библиотекой pika python. Чтение сообщений в цикле выполняется

connection = rpc.connect()
channel = connection.channel()
channel.basic_consume(rpc.consumeCallback, queue=FromQueue, no_ack=Ack)
channel.start_consuming()

Это отлично работает. Но мне также нужно прочитать одно сообщение, которое я делаю с:

method, properties, body = channel.basic_get(queue=FromQueue)
rpc.consumeCallback(Channel=channel,Method=method, Properties=properties,Body=body)

Но когда в очереди нет сообщений, скрипт не работает. Как мне реализовать метод get_empty(), описанный здесь?

3 ответа

Я решил это временно с проверкой ответа как:

method, properties, body = channel.basic_get(queue=FromQueue)
if(method == None):
    ## queue is empty

Вы можете проверить пустое тело следующим образом:

def callback(ch, method, properties, body):
    decodeBodyInfo = body.decode('utf-8')
    if decodeBodyInfo != '':
        cacheResult = decodeBodyInfo
        ch.stop_consuming()

Это так просто и удобно:D

В случае, если вы используете channel.consumeгенератор в цикле for, вы можете установить inactivity_timeoutпараметр.

Из документов pika,

      :param float inactivity_timeout: if a number is given (in seconds), will cause the
method to yield (None, None, None) after the given period of inactivity; this 
permits for pseudo-regular maintenance activities to be carried out by the user 
while waiting for messages to arrive. If None is given (default), then the method 
blocks until the next event arrives. NOTE that timing granularity is limited by the 
timer resolution of the underlying implementation.NEW in pika 0.10.0.

поэтому изменение кода на что-то вроде этого может помочь

              for method_frame, properties, body in channel.consume(queue, inactivity_timeout=120):

            # break of the loop after 2 min of inactivity (no new item fetched)
            if method_frame is None
                break

Не забудьте правильно обработать канал и соединение после выхода из цикла.

Другие вопросы по тегам