Javascript RabbitMQ -> 拉取单个消息

Javascript RabbitMQ -> Pull Single Message

我正在尝试从 rabbitmq 中提取一条消息,对其进行处理,然后确认该消息。我不希望它在确认从队列中拉出消息后继续。如果我不在下面的代码中执行 ch.close() ,它会在确认上一条消息后继续拉取消息。

使用 docker RabbitMQ 实例我已经设置了这段代码(有效)但我很好奇 open/closing 通道是否是执行此操作的最佳方式:

amqp.connect('amqp://guest:guest@localhost', (err, conn) => {
 conn.createChannel((err, ch) => {
  if (err) {
   console.error(err);
  } else {
   let q = 'my queue';
   ch.prefetch(1);
   ch.consume(q, data => {
    console.log(data.content.toString());
    ch.ack(data);
    ch.close();
    returnData = data;
   });
  }
 });
});

您可以一次拉取一条消息,使用 channel.get(参见 http://www.squaremobius.net/amqp.node/channel_api.html#channel_get),我发现这很有用,而不是使用消耗(即使使用预取)。为此,您也可以使用长期存在的频道。

var amqpChannel = null;

amqp.connect('amqp://guest:guest@localhost', (err, conn) => {
    conn.createChannel((err, ch) => {
        if (err) {
            console.error(err);
        } else {
            amqpChannel = ch;
        }
    });
});

var readMessageFromQueue = function() {
    if (amqpChannel) {
        amqpChannel.get(q, data => {
            // data will be set to false if no messages are available on the queue.
            if (data) {
                console.log(data.content.toString());
                amqpChannel.ack(data);
            }
        });
    }
}

// Whatever interval you like..
setInterval(readMessageFromQueue, 1000);