如何获取当前已加入的邮件数量?
我的代码基本上如下:
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是否也支持这个。
答案 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
是队列中消息的确切数目