0

我正在尝试通过Pika 库编写一个使用 RabbitMQ 的 Python 应用程序。我正在使用最新版本,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 来避免,现在我注意到这封电子邮件似乎表明这条新的开发路线已成为死胡同?

谢谢你的帮助!

4

2 回答 2

1

如果你想用 Python 做 AMQP,那么你需要有一个库的源代码副本可供搜索和浏览。仅使用 API 文档是无法成功使用这些库的。

在这种情况下,我假设您没有得到回溯,因为异常在某处被捕获和忽略。否则,您将看到需要在回溯底部捕获的异常。请记住,异常是对象,一些库使用诸如 socket.error 之类的名称而不是 TypeError 或 IOError。

您可能需要在代码中寻找所有except语句并向它们添加 log.debug() 调用。

如果您修复了 pika 代码,请务必提交补丁。

于 2011-05-12T07:11:18.083 回答
1

最初,我认为pika.exceptions.LoginError如果登录失败会引发。但是,仅当提供的身份验证类型不受 AMQP 代理支持时才会引发。它不会在身份验证失败时引发。

在对 Pika 源进行了一些修改(打印入站帧)之后,似乎在客户端发送Connection.StartOK(包括凭据)之后,如果它们不被接受,则不会收到任何响应。如果它们接受,则接收到的下一帧是Connection.Tune

我不确定答案是什么。尝试使用默认的“guest:guest”凭据。如果他们失败了,也许你有一个不同的问题。您的代码片段适用于我的默认用户名:密码。

于 2011-05-09T00:38:38.993 回答