0

Pika ライブラリを使用して、RabbitMQ を使用する Python アプリケーションを作成しようとしています。最新バージョンの 0.9.5 を使用しています。私の問題は、エラーを通知する Pika コールバックを登録する方法がわからないため、Python コードが RabbitMQ のユーザー名とパスワードが間違っていることを検出できないことです。私のコードは次のように接続しています:

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と、3 秒を少し超える時間が経過した後、プログラムが終了します。コールバックを登録する方法や、デッド接続の状態を単純に調べて、エラーが発生したかどうかを判断したり、それが不正なパスワード エラーであることを特定したりする方法がわかりません。Pika のドキュメントで重要なことを見逃していませんか?

Pika 0.9.5 のエラー処理がどのように機能するかを理解してくれる人はいますか? それとも、0.9.5は、この新しい開発ラインが行き止まりになっていることを示しているように見えるこの電子メール メッセージに気付いたので、代わりに以前のバージョンの Pika を使用することで避けるべき、ある種の恐ろしい実験なのでしょうか?

助けてくれてありがとう!

4

2 に答える 2

1

pika.exceptions.LoginError当初、ログインに失敗すると発生すると思いました。ただし、提供された認証タイプがAMQPブローカーでサポートされていない場合にのみ発生します。認証に失敗しても発生しません

Pikaソースをハッキング(インバウンドフレームを印刷)した後、クライアントがConnection.StartOK(資格情報を含む)送信した後、それらが受け入れられない場合、応答は受信されないようです。それら受け入れられた場合、次に受信されるフレームはですConnection.Tune

答えがわかりません。デフォルトの「guest:guest」クレデンシャルで試してください。それらが失敗した場合、おそらく別の問題があります。コードスニペットは、デフォルトのusername:passwordで機能します。

于 2011-05-09T00:38:38.993 に答える
1

Python で AMQP を実行したい場合は、ライブラリのソース コードのコピーを検索および参照できるようにする必要があります。API ドキュメントを使用するだけでは、これらのライブラリで成功することはできません。

この場合、どこかで例外がキャッチされて無視されているため、トレースバックが得られないと想定しています。そうしないと、トレースバックの下部でキャッチする必要がある例外が表示されます。例外はオブジェクトであり、一部のライブラリは TypeError や IOError の代わりに socket.error などの名前を使用することに注意してください。

すべてのステートメントを探してコードを調べ、exceptそれらに log.debug() 呼び出しを追加する必要がある場合があります。

また、ピカコードを修正する場合は、必ずパッチを提出してください。

于 2011-05-12T07:11:18.083 に答える