Python如何检测RabbitMQ密码错误?
我正在尝试写一个使用RabbitMQ的Python应用程序,使用的是Pika库。我用的是最新版本0.9.5。我的问题是,我的Python代码无法检测到RabbitMQ的用户名和密码是否错误,因为我不知道怎么注册一个Pika的回调函数来告诉我发生了错误。我的代码是这样连接的:
import pika
class MyClient(object):
def __init__(self, host, username, password):
self.host = host
self.username = username
self.password = password
self.connection = None
def connect(self):
credentials = pika.PlainCredentials(self.username, self.password)
parameters = pika.ConnectionParameters(
host=self.host, credentials=credentials, heartbeat=True,
)
self.connection = pika.SelectConnection(
parameters, self.on_connected,
)
self.connection.add_on_close_callback(self.on_close)
self.connection.ioloop.start()
def on_connected(self, *args, **kw):
print 'I am connected!', args, kw
def on_close(self, *args, **kw):
print 'I am closed!', args, kw
my_client = MyClient('...', '...', '...')
my_client.connect()
# (Good, I remembered to remove the username and password
# before pasting to Stack Overflow!)
如果我运行这个脚本,ioloop
会运行大约三秒钟,然后程序就结束了。我不知道怎么注册一个回调函数,甚至连检查连接状态都做不到,无法判断是否发生了错误,或者具体是密码错误。我是不是在Pika的文档中漏掉了什么重要的内容?
有没有人能帮我理解一下Pika 0.9.5的错误处理应该怎么工作?还是说0.9.5是个糟糕的实验,我应该避免使用,改用早期版本的Pika?因为我发现了这封邮件,似乎表明这个新版本的开发已经走到了死胡同?
谢谢大家的帮助!
2 个回答
最开始,我以为如果登录失败,就会出现 pika.exceptions.LoginError
这个错误。不过其实只有在提供的认证类型不被 AMQP 代理支持时,才会出现这个错误。也就是说,认证失败并不会导致这个错误出现。
我在 Pika 的源代码里搞了一些小实验(打印进来的数据帧),发现当客户端发送 Connection.StartOK
(里面包含了登录信息)后,如果这些信息没有被接受,就不会收到任何回应。如果信息被接受了,接下来收到的就是 Connection.Tune
。
我不太确定具体的解决办法。你可以试试默认的 'guest:guest' 登录信息。如果这个也不行,可能你遇到的是其他问题。我的代码片段在使用默认的用户名和密码时是可以正常工作的。
如果你想用Python来做AMQP(高级消息队列协议),那么你需要有你所用库的源代码,这样才能方便地查找和浏览。光靠API文档是无法搞定这些库的。
在这种情况下,我假设你没有看到错误追踪信息(traceback),因为某些地方捕获了异常并且忽略了它们。否则你会在错误追踪的底部看到需要处理的异常。记住,异常也是对象,有些库会用像socket.error这样的名称,而不是TypeError或IOError。
你可能需要在代码中寻找所有的except
语句,并在它们里面加上log.debug()的调用。
如果你修复了pika的代码,记得提交一个补丁哦。