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-okAMQP.Queue.DeclareOk在 java AMQP 客户端库中)。

虽然您收到的消息计数queue.declare-ok可能与队列中的确切消息数匹配,但您不能依赖它,因为它不计算在事务期间等待确认或发布到队列但尚未提交的消息。

这真的取决于你需要什么样的精度。

对于排队的消息正文,您可能需要手动提取队列中的所有消息,查看它们的正文并将它们放回队列。这是做你想做的事的唯一方法。

您可以使用管理插件RabbitMQ 管理 HTTP APIrabbitmqctl util 获取有关消息计数的一些信息(请参阅 list_queues、list_channels)。

自创建队列以来,您无法获得已发布的消息总数,而且我认为没有人在它无用的情况下实现此类统计信息(仅供参考,消息流平均每秒 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 回答
9

要通过 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 是默认虚拟主机“/”

于 2017-05-25T12:30:38.947 回答