如何使用node-amqp获取队列中的消息数

时间:2013-12-12 17:35:24

标签: node.js rabbitmq amqp

我正在使用node-amqp作为节点应用程序中的排队系统。我希望能够监控队列的状态,以确定我们是否有足够的工作人员运行,即如果队列大小增加,我们知道我们开始落后。

我知道从命令行可以使用像

这样的东西
rabbitmqctl list_queues

这给了我所需的确切信息,但我想知道是否还有从node-amqp本身做到这一点?

提前致谢。

修改

最后,我只是使用命令行工具rabbitmqctl来获取我需要的信息,这不是一个很好的解决方案,但这就是我所做的;

var Logger = require('arsenic-logger');

getQueueMeta(function(info){
    Logger.info(info);
});

/**
* Returns a sparse array with the queue names as the indices
* and the number of messages as the value, e.g.;
*
* info = [ my-queue: 9, my-other-queue: 1 ]
* 
* @param callback
*/
function getQueueMeta(callback){

    var sys = require('sys')
    var exec = require('child_process').exec;

    exec("/usr/local/sbin/rabbitmqctl list_queues", function(error, stdout, stderr) {

        var info = [];

        if (!error){

            var lines = stdout.split(/\n/);

            if (lines.length > 1){

                for (var i=1; i<lines.length-2; i++){
                    var temp = lines[i].split(/\s/);
                    info[temp[0].trim()] = parseInt(temp[1]);
                }

            }

        }

        callback(info);

    });

}

2 个答案:

答案 0 :(得分:7)

我可能有点迟到了,但如果将来有人遇到这个问题...在当前版本的 node-amqp (0.2.4)你可以检查两个消息计数和声明队列时当前订阅的消费者数量。

var connection = require("amqp").createConnection();
connection.exchange("exampleExchange", {/*...*/}, function(exchange) {
  connection.queue("exampleQueue", {/*...*/}, function(queue, messageCount, consumerCount){
    console.log("Message count", messageCount);
    console.log("Consumer count", consumerCount);
  });
});

答案 1 :(得分:0)

因此RabbitMQ支持AMQP高达0.9.1。您可以直接查看文档here

快速浏览文档将揭示AMQP仅涵盖连接,交换和基本排队/出列等内容。但是rabbitmqctl中的许多功能都无法通过AMQP规范访问。通过这种方式,rabbitmqctl更接近于“管理”工具,其中AMQP连接基本上是一种“消费者”工具。

那说,你可能很幸运。请查看connection.queue() method

var q = connection.queue('my-queue', function (queue) {
  console.log('Queue ' + queue.name + ' is open');
});

在.NET实现中,queue变量看起来不仅包括名称,还包括消费者和消息计数。我不清楚node.js中有什么可用,你可能需要深入研究。