无法使用节点中的amqp包从Rabbitmq中取消消息

时间:2016-04-22 10:20:31

标签: node.js rabbitmq amqp

我使用以下节点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,但不是只有一条消息已经出列,而是所有消息都已经出列了!

请帮我出一条信息。

1 个答案:

答案 0 :(得分:0)

将noack设为true。

  

noAck(boolean):如果为true,则服务器将假定该消息   一旦被发送,就被承认(即出列)   线。默认值为false,即您需要确认   消息。

http://www.squaremobius.net/amqp.node/channel_api.html#channel_get

或者删除noack并确保检查msg!== null(如果在空对象上调用ch.ack(),它只会抛出一个通道异常)。