RabbitMQ - 获取入队消息的总数

时间:2013-07-16 18:59:45

标签: java rabbitmq

我有一个监控Rab​​bitMQ队列的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. 自创建队列以来队列中排队的邮件总数。
  3. 有没有办法在Java客户端中检索这些数据?

3 个答案:

答案 0 :(得分:12)

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

与邮件计数最接近的数字是使用queue.declare-ok(java AMQP客户端库中的AMQP.Queue.DeclareOk)返回的邮件计数。

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

这真的取决于你需要什么样的准确性。

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

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:5)

通过http api

访问队列详细信息

DECLARE @dropAllConstraints NVARCHAR(MAX) = N''; SELECT @dropAllConstraints += N' ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';' FROM sys.foreign_keys; EXEC sp_executesql @dropAllConstraints

通过localhost cli promt命令访问队列详细信息,

delete from table insert into table (...)

其中, %2f是默认的vhost&#34; /&#34;