web-dev-qa-db-ja.com

RabbitMQ-エンキューされたメッセージの総数を取得します

私はJavaクライアントを持っています。このコードで現在キューにあるメッセージの数を取得できます

@Resource
RabbitAdmin rabbitAdmin;
..........

DeclareOk declareOk = rabbitAdmin.getRabbitTemplate().execute(new ChannelCallback<DeclareOk>() {
        public DeclareOk doInRabbit(Channel channel) throws Exception {
            return channel.queueDeclarePassive("test.pending");
        }
    });
     return declareOk.getMessageCount();

次のような追加の詳細情報を入手したい-

  1. 現在エンキューされているアイテムのメッセージ本文。
  2. キューの作成以降にキューにエンキューされたメッセージの総数。

Javaクライアントでこれらのデータを取得する方法はありますか?

14
Code Geass

AMQPプロトコル(RabbitMQ実装を含む)では、100%の保証ではそのような情報を取得できません。

メッセージ数に最も近い数は、Javaの_queue.declare-ok_( _AMQP.Queue.DeclareOk_ で返されるメッセージ数です。 = AMQPクライアントライブラリ)。

_queue.declare-ok_を使用して受信したメッセージ数は、キューに登録された正確なメッセージ数と一致する可能性がありますが、トランザクション中に確認応答を待っているか、キューに発行されたがまだコミットされていないメッセージはカウントしないため、信頼できません。

それは本当にどのような精度が必要かによります。

エンキューされたメッセージの本文については、キュー内のすべてのメッセージを手動で抽出し、本文を表示して、キューに戻すことができます。これがあなたが望むことをする唯一の方法です。

Management PluginRabbitMQ Management HTTP API および rabbitmqctl util(list_queues、list_channelsを参照)。

キューが作成されてからパブリッシュされたメッセージの総数を取得することはできません。そのような統計は役に立たない間は実装されていないと思います(FYI、メッセージフローが平均10k /秒の場合、数千年でuint64に到達しません)。

13
pinepain
AMQP.Queue.DeclareOk dok = channel.queueDeclare(QUEUE_NAME, true, false, false, queueArgs);
dok.getMessageCount();
8
Giumbix

Http api経由でキューの詳細にアクセスするには、

http://public-domain-name:15672/api/queues/%2f/queue_name

Localhost cli promtからコマンドを使用してキューの詳細にアクセスするには、

curl -i -u guest_uname:guest_password http://localhost:15672/api/queues/%2f/queue_name

ここで、%2fはデフォルトの仮想ホスト「/」です

5
Hemant Thorat