RabbitMQ with NodeJS - 使用 amqplib 获取消息计数

Ale*_*exD 8 rabbitmq node.js

如何获取当前排队的消息数?

我的代码基本上如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

我在文档中或调试时没有发现任何内容,并且我确实看到了允许此操作的不同库,因此想知道 amqplib 是否也支持此操作。

小智 5

您可以使用 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);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

它将返回一个像这样的对象:

{ queue: 'task2_queue', messageCount: 34, consumerCount: 2 }
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息:https ://www.squaremobius.net/amqp.node/channel_api.html#channel_assertQueue


Der*_*ley 3

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

但真正的技巧是,一旦调用assertQueue,这个数字就永远不会更新。获取更新的消息计数的唯一方法是再次调用assertQueue。如果您检查得太频繁,这可能会对性能产生一些影响。

  • 您需要等待承诺得到解决。使用这个:`ch.assertQueue(config.inputQueue).then(function(info){console.log(info.messageCount)})` (2认同)