Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RabbitMQ使用一条消息(如果存在)并退出_Python_Rabbitmq_Amqp - Fatal编程技术网

Python RabbitMQ使用一条消息(如果存在)并退出

Python RabbitMQ使用一条消息(如果存在)并退出,python,rabbitmq,amqp,Python,Rabbitmq,Amqp,我正在python上运行代码,以便从另一个不允许线程的应用程序发送和接收RabbitMQ队列。 这是一个非常新的问题,但是,是否有可能只是检查是否有消息,如果没有任何消息,然后停止听?我应该如何更改此类任务的基本“Hello world”示例?目前,如果收到消息,我已设法停止消费,但如果没有消息,我的方法receive()只需继续等待。如果没有消息,如何强制它不等待?或者只等待给定的时间 import pika global answer def send(msg): connect

我正在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

好的,我找到了以下解决方案:

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

ruby API有一个检查队列长度的方法。。你检查过python文档吗?检查method\u frame是否为None也很重要。如果队列中没有其他消息,channel.basic_get(queue='toM')将返回None-s。@GrayR是否有方法执行此操作并在完成后确认消息?
method_frame.NAME
对于pika>0.10.0似乎不存在。如果method\u frame为None,只需测试
在pika 1.1.0中运行良好