RabbitMQ потребляет одно сообщение, если существует, и выходит - PullRequest
12 голосов
/ 26 марта 2012

Я выполняю код на python для отправки и получения из очереди RabbitMQ из другого приложения, где я не могу разрешить создание потоков.Это очень новый вопрос, но есть ли возможность просто проверить, есть ли сообщение, и если его нет, просто прекратить прослушивание?Как мне изменить базовый пример "Hello world" для такой задачи?В настоящее время мне удалось прекратить потребление, если я получаю сообщение, но если нет никаких сообщений, мой метод receive () просто продолжает ждать.Как заставить его не ждать, если нет сообщений?Или, может быть, ждать только определенное количество времени?

import pika

global answer

def send(msg):
    connection = pika.BlockingConnection(pika.ConnectionParameters())
    channel = connection.channel()
    channel.queue_declare(queue='toJ')
    channel.basic_publish(exchange='', routing_key='toJ', body=msg)
    connection.close()

def receive():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='toM')
    channel.basic_consume(callback, queue='toM', no_ack=True)
    global answer
    return answer

def callback(ch, method, properties, body):
    ch.stop_consuming()
    global answer
    answer = body

1 Ответ

21 голосов
/ 24 мая 2013

Хорошо, я нашел следующее решение:

def receive():
    parameters = pika.ConnectionParameters(RabbitMQ_server)
    connection = pika.BlockingConnection(parameters)
    channel = connection.channel()
    channel.queue_declare(queue='toM')
    method_frame, header_frame, body = channel.basic_get(queue = 'toM')        
    if method_frame.NAME == 'Basic.GetEmpty':
        connection.close()
        return ''
    else:            
        channel.basic_ack(delivery_tag=method_frame.delivery_tag)
        connection.close() 
        return body
...