如何在组件之间拆分RabbitMQ代码?

时间:2019-03-27 01:39:53

标签: javascript node.js express rabbitmq backend

我想拆分RabbitMQ连接代码并在不同的组件之间调用它,以便它(连接和通道)仅初始化ONCE,并且我可以在任何时候使用它,而不必在我想使用它时再次打开连接

现在发生的事情是,每当我想将某些内容传递给交换和队列时,我都会一遍又一遍地调用以下代码。 (因此,如果我想将20个单独的数据传递给RabbitMQ,我最终会打开和关闭连接和通道20次)

有解决方案吗?

const exchange = "Exchange";
const queue = "Queue";

const passSomeData= async payload => {
  amqp = require("amqplib").connect("amqp://localhost");
  let ch;
  let connection;
  let publish = amqp
    .then(function(conn) {
      connection = conn;
      return conn.createConfirmChannel();
    })
    .then(function(chn) {
      ch = chn;
      ch.assertQueue(queue, { durable: true });
      return ch.assertExchange(exchange, "topic", { durable: true });
    })
    .then(function() {
      const data = {
        content: "x",
        title: "y",
      };
      ch.bindQueue(queue, exchange, "routingKey");

      return ch.publish(exchange, "routingKey", Buffer.from(JSON.stringify(data)), {
        persistent: true
      });
    })
    .then(() => {
      setTimeout(function() {
        connection.close();
      }, 250);
    });
};

module.exports = passSomeData;

1 个答案:

答案 0 :(得分:0)

here复制的答案

这是一个通用的Javascript问题,并非特定于RabbitMQ或amqplib库。

我相信您可以在模块级别打开一个连接,并在passSomeData方法中使用该连接。或者,如果模块级别的“连接”变量为null,则passSomeData可以延迟打开连接,然后重新使用该连接。

有时候,您可能需要使用连接池,但这取决于您的用例和工作量。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。