我希望能够在向AMQP提交消息时检测到交换是否不存在。

考虑下面的例子。

#!/usr/bin/python

import amqp
from time import sleep

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", virtual_host="/")
outgoing = conn.channel()
message = amqp.Message("x")


while True:
    print "publish message."
    outgoing.basic_publish(message,exchange="non-existing",routing_key="fubar")
    sleep(1)


此脚本将继续发布到交换,但是如果交换不存在,则不会引发任何错误。当交换存在时,消息到达。

#!/usr/bin/python

import amqp
from time import sleep

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", virtual_host="/")
outgoing = conn.channel()
message = amqp.Message("x")


while True:
    print "publish message."
    outgoing.basic_publish(message,exchange="non-existing",routing_key="fubar")
    outgoing.wait()
    sleep(1)


当我添加outgoing.wait()时,会引发amqp.exceptions.NotFound。但是问题是,如果在这种情况下存在交换,则消息到达,但是outing.wait()阻塞了我的循环。
(我可以在单独的线程中运行outing.wait(),但我不想这样做。)

怎么处理呢?

任何建议提示指针欢迎

谢谢,

周杰伦

最佳答案

如果要确定是否存在交换,请使用exchange_declare方法并将被动标志设置为True。将被动标志设置为True将阻止服务器尝试创建交换,如果交换不存在,则抛出错误。

import amqp
from amqp.exceptions import NotFound

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest",
                       virtual_host="/")
outgoing = conn.channel()
try:
    outgoing.exchange_declare("fubar", "", passive=True)
except NotFound:
    print "Exchange 'fubar' does not exist!"


如果您真正感兴趣的是确保交换在发布之前存在,那么只需在进入发送循环之前声明它即可。如果交换已经存在,将不会发生任何事情。如果交换不存在,将创建它。

import amqp

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest",
                       virtual_host="/")
outgoing = conn.channel()
outgoing.exchange_declare("fubar", "direct")


这是您使用的amqp库中exchange_declare的方法声明的链接:

https://github.com/celery/py-amqp/blob/master/amqp/channel.py#L460-L461

关于python - py-amqp不存在检测交换的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14968498/

10-16 02:14