RabbitMQ - 获取排队的消息总数

2022-09-03 04:05:49

我有一个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();

我想获得更多其他细节,例如 -

  1. 当前排队项目的消息正文。
  2. 自创建队列以来在队列中排队的消息总数。

有没有办法在Java客户端中检索这些数据?


答案 1

使用AMQP协议(包括RabbitMQ实现),您无法100%保证获得此类信息。

与消息计数最接近的数字是随 (AMQP.Queue.DeclareOk in java AMQP client library)。queue.declare-ok

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

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

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

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

自队列创建以来,您无法获得已发布的消息总数,并且我认为没有人在无用的情况下实现此类统计信息(仅供参考,消息流平均为每秒10k,您甚至不会在几千年内达到uint64)。


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

推荐