web-dev-qa-db-ja.com

RabbitMQを使用して、デキュー操作なしでキューの内容を確認する方法はありますか?

RabbitMQとpythonを学ぶ方法として、私は複数のコンピューター間でh264エンコードを配布できるプロジェクトに取り組んでいます。基本は完了しました。Linux上で実行するデーモンがあります。またはキューに接続し、ジョブを受け入れ、HandBrakeCLIを使用してそれらをエンコードし、エンコードが完了するとメッセージを確認応答するMacアイテムをキューにプッシュする簡単なツールも作成しました。

次に、アイテムをキューにプッシュするツールの機能を拡張して、キューの内容を確認できるようにします。キューにアイテムがいくつあるかを確認できることは承知していますが、実際のメッセージを取得して、まだエンコードされていない映画やテレビ番組を表示できるようにしたいと考えています。アイデアは、ジョブが完了したときにキューマネージャーがエンコーダークライアントからメッセージを受信し、キューリストを更新するというものです。

キューマネージャーのリストを実際の作業キューと同期させる複雑な方法があることはわかっていますが、これを「永続的」にして、キューマネージャーを閉じて後で再び開いてキューを表示できるようにする必要があります。

42
Dustin

キューの参照は直接サポートされていませんが、自動確認応答なしでキューを宣言し、受信したメッセージにACKを送信しない場合は、キュー内のすべてを確認できます。確認したら、チャネルにCANCELを送信するか、切断して再接続し、すべてのメッセージを再度キューに入れます。これにより、メッセージヘッダーの番号が増加しますが、それ以外の場合、メッセージは変更されません。

メッセージの順序がそれほど重要ではないアプリを作成し、この方法でキューを頻繁にスキャンしました。問題が見つかった場合は、メッセージをファイルにダンプして修正し、再送信します。

たまに1つか2つのメッセージをのぞくだけでよい場合は、RabbitMQ管理プラグインでそれを行うことができます。

さらに、メッセージ数だけが必要な場合は、キューを宣言するたびに、またはbasic.getコマンドでそれを取得できます。

39
Michael Dillon

@MichaelDillonは、あなたの答えに基づいて他の人の生活をより簡単にするために、ここにno_ackの例を示します。

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(Host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='Q.hello')


def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    # ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(callback, queue='Q.hello')

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
3
Tomasz

あなたがしたいことはbrowsingと呼ばれますが、RabbitMQがまだサポートしていない this から収集しています。

0
Lee at NCR