2

メッセージがキューに配信されたことを確認したいのですが。

そのために、basic_publishに必須のパラメータを追加しています。basic.returnメッセージが正常に配信されなかった場合、メッセージを受信するには他に何をすべきですか?

メッセージが正常に配信されると関数が永久にハングchannel.wait()するため、リッスンに使用できません。(タイムアウトはありません)一方。電話をかけないと、メッセージが配信されなくても、は空のままになります。basic.returnwait()channel.wait()channel.returned_messages

py-amqplibバージョン0.6を使用しています。

どんな解決策も歓迎します。

4

3 に答える 3

1

basic.returnメッセージがブローカーにドロップされると非同期で送信されるため、現在は不可能です。メッセージが正常に送信された場合、サーバーからデータは報告されません。したがって、pyAMQPはそのようなメッセージをリッスンできません。

私はこの問題についていくつかのスレッドを読みました。考えられる解決策は次のとおりです。

  • basic.returnを処理するamqpのツイストバージョンであるtxAMQPを使用します
  • タイムアウト付きの待機でpyAMQPを使用します。(それが現在可能かどうかはわかりません)
  • pyAMQPがメッセージのbasic.return到着時にメッセージを選択できるように、同期コマンドを使用してサーバーに頻繁にpingを実行します。

一般にpyAMQPとrabbitMQのサポートレベルは非常に低いため、amqpブローカーをまったく使用しないことにしました。

于 2010-02-10T22:30:26.483 に答える
1

完成した唯一のPythonAMQPライブラリを試しましたか?きちんとパッケージ化されていないため、あまり広く使用されていません。

ステップ1.Cライブラリをコンパイルします-必要な場合がありますsudo apt-get install autotools-dev autoconf automake libtool

mkdir rabbitc
cd rabbitc
hg clone http://hg.rabbitmq.com/rabbitmq-codegen/
hg clone http://hg.rabbitmq.com/rabbitmq-c/
cd rabbitmq-c
autoreconf -i
make clean
./configure --prefix=/usr
make
sudo make install

ステップ2.Pythonライブラリをインストールします

pip install pylibrabbitmq
于 2011-07-05T02:20:03.737 に答える
1

非同期システムであるため、これを同期的に行うことはできません。ただし、スレッドを使用してこの問題を解決できます。

基本的な考え方は、チャネルで待機を行うスレッドを開始し、待機から抜け出すたびに、返されたメッセージキュー内の返されたメッセージに対してcall_back関数を呼び出すことです。その後、call_back関数でそのメッセージを処理できます。

def registerCallback(channel, call_back):
    """ This method sets up a thread which deals with the asynchronous callback for a message which could not be routed by the exchange.
    """
    def wait():
        try:
            channel.wait()
        except Exception, e:
            print("Problem waiting on publish channel: %s" % str(e))

        while not channel.returned_messages.empty():
            returnedMessage = channel.returned_messages.get()
            processReturnedMessageThread = Thread(target=call_back, args=(returnedMessage))
            processReturnedMessageThread.start()

        wait()

    waiting = Thread(target=wait) 
    waiting.start()
于 2011-10-13T09:02:55.830 に答える