RabbitMQ - 获取入队消息的总数

Cod*_*ass 13 java rabbitmq

我有一个监视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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

pin*_*ain 13

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

消息计数最接近的数字是返回的消息计数queue.declare-ok(AMQP.Queue.DeclareOk在java AMQP客户端库中).

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

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

对于排队邮件正文,您可能希望手动提取队列中的所有邮件,查看其正文并将其放回队列.这是做你想做的事的唯一方法.

您可以使用Management Plugin,RabbitMQ Management HTTP APIrabbitmqctl util 获取有关消息计数的一些信息(请参阅list_queues,list_channels).

自从队列创建以来,您无法获得已发布的总消息数量,我认为没有人实现此类统计数据而无用(FYI,消息流量平均每秒10k,甚至几千年内甚至无法达到uint64).


小智 8

AMQP.Queue.DeclareOk dok = channel.queueDeclare(QUEUE_NAME, true, false, false, queueArgs);
dok.getMessageCount();
Run Code Online (Sandbox Code Playgroud)

  • 如果队列声明 args 与创建队列时使用的不同,则会出现错误。改用 queueDeclarePassive (2认同)

小智 5

要通过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"/"

  • 需要注意的是,此解决方案依赖于管理插件。https://www.rabbitmq.com/management.html#http-api-endpoints (2认同)