简体   繁体   English

获取来自RabbitMQ的所有消息

[英]Get all messages from rabbitMQ

I'm trying to get all messages from rabbitMQ queue. 我正在尝试从RabbitMQ队列中获取所有消息。

const messages = await rabbit.getMessages(outputQueue, false);

Here is realization of getMessages method. 这是getMessages方法的实现。 The problem is it processes only 3-5 messages and calling 'resolve'. 问题在于它仅处理3-5条消息并调用“解决”。 Some time later it processes rest messages, but 'resolve' has already been called and it can't be executed again. 一段时间后,它会处理剩余消息,但已经调用了“解决”,因此无法再次执行。

const amqp = require('amqplib');
.
.
let amqpUrl;
let queueConf;

const init = (connection, queue) => {
  amqpUrl =`amqp://${connection.user}:${connection.password}@${connection.host}:${connectio    n.port}`;
  if (connection.vhost) {
amqpUrl = `amqp://${connection.user}:${connection.password}@${connection.host}:${connection.port}/${connection.vhost}`;
  }
  queueConf = queue;
}

const getChannel = () => new Promise((resolve) => {
  amqp.connect(amqpUrl).then((conn) => {
    conn.createChannel().then((ch) => {
      ch.prefetch(1000).then(() => resolve(ch))
    })
  })
})

module.exports = (connection, queue) => {
  init(connection, queue);
  return {
    getMessages: (queueName, cleanQueue) => new Promise((resolve) => {
      let messages = [];
      let i = 1;
      getChannel().then((ch) => {
        ch.consume(queueName, (msg) => {
          messages.push(msg);
          console.log(msg.content.toString())
        }, { noAck: cleanQueue }).then(() => {
          logger.info(`Retreived ${messages.length} messages from ${queueName}`);
          resolve(messages)
        })
      })
    })
    .
    .
    };
  };

Thanks in advance ! 提前致谢 !

You can do it like this but it will be very slow and will possibly never resolve if messages are added to the queue faster than you can consume them. 您可以这样做,但是它会非常慢,并且如果将消息添加到队列中的速度比消耗消息的速度更快,则可能永远无法解决。 Essentially you keep getting one message at a time until channel.get() resolves with false instead of a message object: 基本上,您每次都会收到一条消息,直到channel.get()解析为false而不是消息对象为止:

getMessages: (queueName, cleanQueue) => {
  let messages = []
  let i = 1
  return getChannel().then(function getMessage (ch) {
    return ch.get(queueName, { noAck: cleanQueue }).then((msg) => {
      if (msg) {
        messages.push(msg)
        return getMessage(ch)
      } else {
        logger.info(`Retrieved ${messages.length} messages from ${queueName}`)
        return messages
      }
    })
  }).catch((err) => {
    err.consumedMessages = messages
    return Promise.reject(err)
  })
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM