RabbitMQ - Получить общее количество сообщений, находящихся в очереди

У меня есть клиент Java, который контролирует очередь RabbitMQ. Я могу получить количество сообщений, находящихся в очереди в этом коде

@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();

Я хочу получить дополнительную информацию, например -

  • Тело сообщения текущих элементов, находящихся в очереди.
  • Общее количество сообщений, помещенных в очередь в очереди с момента создания очереди.

Есть ли способ получить эти данные в Java-клиенте?

Ответ 1

С протоколом AMQP (включая реализацию RabbitMQ) вы не можете получить такую ​​информацию со 100% гарантией.

Ближайшее число к числу сообщений - это количество сообщений, возвращенных с помощью queue.declare-ok (AMQP.Queue.DeclareOk в java-библиотеке AMQP).

В то время как количество сообщений, которое вы получаете с помощью queue.declare-ok, может совпадать с точными номерами номеров сообщений, вы не можете полагаться на него, поскольку оно не подсчитывает сообщения, которые ожидают подтверждения или публикации в очереди во время транзакции, но еще не зафиксированы.

На самом деле это зависит от того, какая прецессия вам нужна.

Что касается объекта, о котором вы можете узнать, вы можете вручную извлечь все сообщения в очереди, просмотреть их тело и вернуть их в очередь. Это единственный способ сделать то, что вы хотите.

Вы можете получить некоторую информацию о количестве сообщений с помощью Плагин управления, RabbitMQ API управления HTTP и rabbitmqctl util (см. List_queues, list_channels).

Вы не можете получить общее количество опубликованных сообщений, так как очередь была создана, и я думаю, что никто не реализует такую ​​статистику, пока она бесполезна (FYI, при рассылке сообщений в среднем 10k в секунду вы даже не достигнете uint64 за несколько тысяч лет).

Ответ 2

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

Ответ 3

Чтобы получить доступ к информации о очереди через 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 - это по умолчанию vhost "/"