带有NodeJS的RabbitMQ - 使用amqplib来获取消息计数

时间:2015-11-29 15:33:06

标签: 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.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是否也支持这个。

4 个答案:

答案 0 :(得分:2)

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

但真正的诀窍是,一旦调用assertQueue,这个数字就永远不会更新。获取更新消息计数的唯一方法是再次调用assertQueue。如果您经常检查它,可能会产生一些性能影响。

答案 1 :(得分:0)

我找不到使用node的直接解决方案,但是通过使用RabbitMQ中的api,我能够获得消息计数。 After enabling management plugin of RabbitMQ可以使用http://127.0.0.1:15672/api/queues/vhost/name访问api,并以密码访客身份登录访客。

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);
        }
    }
});

答案 2 :(得分:0)

您可以使用amqplib获得队列长度。

在我的情况下,队列具有“ durable: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 }

有关更多信息:https://www.squaremobius.net/amqp.node/channel_api.html#channel_assertQueue

答案 3 :(得分:0)

您应该调用channel.checkQueue(queueName),然后会得到一个对象{ queue: 'queueName', messageCount: 1, consumerCount: 0 },其中的属性messageCount是队列中消息的确切数目