Node.js 带NodeJS的RabbitMQ-使用amqplib获取消息计数

Node.js 带NodeJS的RabbitMQ-使用amqplib获取消息计数,node.js,rabbitmq,Node.js,Rabbitmq,如何获取当前排队的邮件数 我的代码基本如下: function readQueue() { var open = require('amqplib').connect(config.rabbitServer); open.then(function (conn) { var ok = conn.createChannel(); ok = ok.then(function (ch) { ch.prefetch(config.

如何获取当前排队的邮件数

我的代码基本如下:

function readQueue() {
    var open = require('amqplib').connect(config.rabbitServer);

    open.then(function (conn) {
        var ok = conn.createChannel();
        ok = ok.then(function (ch) {
            ch.prefetch(config.bulkSize);

            setInterval(function () {
                handleMessages();
            }, config.bulkInterval);

            ch.assertQueue(config.inputQueue);
            ch.consume(config.inputQueue, function (msg) {
                if (msg !== null) {
                    pendingMessages.push(msg);
                }
            });
        });
        return ok;
    }).then(null, console.warn);
}

我在文档中或调试时未发现任何内容,但我确实看到了另一个允许此操作的库,因此怀疑amqplib是否也支持此操作。

我认为assertQueue方法调用将返回包含当前消息计数的对象。我不记得确切的财产名称,但它应该在那里


不过,真正的诀窍是,一旦调用assertQueue,该号码将永远不会更新。获取更新消息计数的唯一方法是再次调用assertQueue。如果您过于频繁地检查,这可能会影响性能

我找不到使用node的直接解决方案,但通过使用RabbitMQ的api,我能够获得消息计数。 这些API可以使用和用户登录为guest并使用guest密码进行访问

var request = require('request');
var count_url = "http://guest:guest@127.0.0.1:15672/api/queues/%2f/" + q;
var mincount = 0;
..........
..........
request({
    url : count_url
}, function(error, response, body) {
    console.log("Called RabbitMQ API");
    if (error) {
        console.error("Unable to fetch Queued Msgs Count" + error);
        return;
    }
    else
    {
        var message = JSON.parse(body);

        if (message.hasOwnProperty("messages_ready")) {
            // this DOES NOT COUNT UnAck msgs
            var msg_ready = JSON.stringify(message.messages_ready);
            console.log("message.messages_ready=" + msg_ready);
            if (msg_ready == mincount) {
                console.log("mincount Reached ..Requesting Producer");
                ///Code to Produce msgs  ..
            }
        }
        if (message.hasOwnProperty("messages")) {
            // _messages_ total messages i.e including unAck
            var msg = JSON.stringify(message.messages);
            console.log("message.messages=" + msg);
        }
    }
});

您可以使用amqplib获取队列长度

在我的例子中,队列具有“持久:true”特性。您必须将其作为选项传递

var amqp = require('amqplib/callback_api');

amqp.connect(amqp_url, function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'task2_queue';

    ch.assertQueue(q, {durable: true}, function(err, ok) {
      console.log(ok);
    });
  });
});
它将返回如下所示的对象:

{ queue: 'task2_queue', messageCount: 34, consumerCount: 2 }

有关详细信息:

您应该调用
channel.checkQueue(queueName)
,然后您将获得一个对象
{queue:'queueName',messageCount:1,consumerCount:0}
其中属性
messageCount
正好是队列中当前的消息数

我看到的对象是assertQueue“{”\u handler:{“已解析”:false}”的返回值。我是否需要传递一些变量或任何东西来获取该信息?您需要等待承诺得到解决。使用以下命令:
ch.assertQueue(config.inputQueue)。然后(函数(info){console.log(info.messageCount)})
示例:message.messages\u ready=7。message.messages=12。(共5个未确认)