我使用以下节点js代码将我的消息排入Rabiitmq:
//enqueue.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(err, conn) {
conn.createChannel(function(err, ch) {
var q = 'hello';
ch.assertQueue(q, {durable: true});
ch.sendToQueue(q, new Buffer('Msg 1'));
ch.sendToQueue(q, new Buffer('Msg 2'));
ch.sendToQueue(q, new Buffer('Msg 3'));
ch.sendToQueue(q, new Buffer('Msg 4'));
ch.sendToQueue(q, new Buffer('Msg 5'));
});
setTimeout(function() { conn.close(); process.exit(0) }, 500);
});
排队过程按预期进行。
现在我希望只出一条消息,为此我使用这段代码:
//dequeue.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(err, conn) {
conn.createChannel(function(err, ch) {
var q = 'hello';
ch.assertQueue(q, {durable: true});
ch.prefetch(1);
ch.consume(q, function(msg) {
console.log(" [x] Received %s", msg.content.toString());
}, {noAck: false});
});
});
正如所料,输出是:
[x] Received Msg 1
但是消息1仍然在队列中并且它没有出列。所以我尝试在ch.ack(msg)
中的console.log()
语句之后添加dequeue.js
,但不是只有一条消息已经出列,而是所有消息都已经出列了!
请帮我出一条信息。
答案 0 :(得分:0)
将noack设为true。
noAck(boolean):如果为true,则服务器将假定该消息 一旦被发送,就被承认(即出列) 线。默认值为false,即您需要确认 消息。
http://www.squaremobius.net/amqp.node/channel_api.html#channel_get
或者删除noack并确保检查msg!== null(如果在空对象上调用ch.ack(),它只会抛出一个通道异常)。