0

我正在尝试从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;
   });
  }
 });
});
4

1 回答 1

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);
于 2018-02-15T21:20:41.733 回答