我希望能够在向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/