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个未确认)