当队列存在时,通过设置passive="True"查询"queue_declare"返回'None

4 投票
1 回答
6730 浏览
提问于 2025-04-18 02:13

我正在使用pika这个库来处理一个消费者,它从名为“email”的队列中获取数据。

当我用pika的queue_declare方法查询队列时,如果我把passive设置为True,即使队列存在,它也会返回None

我通过网页界面创建了“email”这个队列,并且可以看到它确实存在(这个队列本来是由第三方创建的;我只是为了测试才这样做)。

现在在我的程序中,当我打开通道并准备开始从email队列消费数据之前,我想确认这个队列已经存在,所以我把passive设置为True

def message(channel, envelope, properties, body):
    if send(envelope.routing_key, body):
        channel.basic_ack(envelope.delivery_tag)
        return
    print("Could not send message.")

def channel_open(channel):
    QUEUES = CONFIG._defaults['queues']
    queuelist = QUEUES.split(",")
    for queuename in queuelist:
        result = channel.queue_declare(message,queue=queuename, passive=True)
        if not result:
            raise NameError("declare the queues specified "
                            "in default config section first")
        channel.basic_consume(queue=queuename, consumer_callback=message)

结果我得到的是None,而我本来期待得到ok,因为队列已经存在。有什么建议吗??? 是不是因为这个队列是通过网页界面创建的,所以没有指定回调函数?我只是想知道队列是否存在,但pika的queue_declare函数需要一个回调函数作为参数,如果不提供就会报错。

1 个回答

2

你应该使用回调函数:

def qdeclare_callback(method_frame):
    if not method_frame: # method_frame is a result from queue_declare:
        raise NameError("declare the queues specified "
                        "in default config section first")
    # channel.basic_consume(queue=queuename, consumer_callback=message)
    channel.basic_consume(queue=method_frame.method.queue,
                          consumer_callback=message)

# ...
result = channel.queue_declare(qdeclare_callback, queue=queuename, passive=True)

看看这个文档里的例子: http://pika.readthedocs.org/en/latest/examples/asynchronous_consumer_example.html

撰写回答