16

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 クライアントでこれらのデータを取得する方法はありますか?

4

3 に答える 3

17

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

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

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

それは、どのような精度が必要かによって異なります。

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

Management PluginRabbitMQ Management HTTP APIrabbitmqctl util を使用して、メッセージ数に関する情報を取得できます(list_queues、list_channels を参照)。

キューが作成されてから発行されたメッセージの総数を取得することはできません。また、役に立たない間は誰もそのような統計を実装していないと思います (参考までに、1 秒あたり平均 10k のメッセージ フローでは、数千年で uint64 に到達することさえありません)。

于 2013-07-16T20:58:55.187 に答える
14
AMQP.Queue.DeclareOk dok = channel.queueDeclare(QUEUE_NAME, true, false, false, queueArgs);
dok.getMessageCount();
于 2014-05-20T12:54:33.563 に答える