【问题标题】:Javascript RabbitMQ -> Pull Single MessageJavascript RabbitMQ -> 拉取单个消息
【发布时间】:2018-02-15 14:47:31
【问题描述】:

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

使用 docker RabbitMQ 实例,我设置了这段代码(有效),但我很好奇快速打开/关闭通道是否是最好的方法:

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;
   });
  }
 });
});

【问题讨论】:

  • 想知道这对于 codereview.stackexchange.com 是否是一个更好的问题
  • 也在那里转贴,很好奇是否有人解决了这个问题。它“有效”,但似乎必须有比每次拉消息时关闭频道更好的方法(也许是这样)。

标签: javascript node.js rabbitmq node-amqplib


【解决方案1】:

您可以使用 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);

【讨论】: