Как я могу повторно использовать соединение RabbitMQ и канал вне «структуры установки» с библиотекой amqp? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь создать простой клиент node.js с использованием библиотеки amqp, которая открывает одно соединение, а затем один канал к серверу RabbitMQ. Я хочу повторно использовать одно и то же соединение и канал для отправки нескольких сообщений. Основная проблема в том, что я не хочу писать весь свой код внутри функции обратного вызова функции ceateChannel ().

Как повторно использовать канал вне функции обратного вызова и убедиться, что функция обратного вызова завершена, прежде чем использовать канал?

Я пробовал и способ обратного вызова, и способ обещания, но я не могу заставить ни один из них работать. При использовании метода обратного вызова я сталкиваюсь с описанной проблемой.

При использовании обещаний у меня проблема в том, что я не могу сохранить ссылку на соединение и канал вне функции .then (), потому что переданные переменные уничтожаются после настройки соединения и канала.


amqp.connect('amqp://localhost', (err, conn) => {

  if (err !== null) return console.warn(err);
  console.log('Created connection!');

  conn.createChannel((err, ch) => {

    if (err !== null) return console.warn(err);
    console.log('Created channel!');

    //this is where I would need to write the code that uses the variable "ch"
    //but I want to move the code outside of this structure, while making sure
    //this callback completes before I try using "ch"

  });
});


    amqp.connect('amqp://localhost').then((conn) => {
      return conn.createChannel();
    }).then((ch) => {
      this.channel = ch;
      return ch.assertQueue('', {}).then((ok) => {
        return this.queueName = ok.queue;  
      });
    }).catch(console.warn);

1 Ответ

0 голосов
/ 29 марта 2019

почему вы не используете async\await?

const conn = await amqp.connect('amqp://localhost');
const ch = await conn.createChannel();
// after that you can use ch anywhere, don't forget to handle exceptions

Также, если вы используете amqplib, не забудьте обработать close и внутренние error события, например, вот так:

conn.on('error', function (err) {
    console.log('AMQP:Error:', err);
});
conn.on('close', () => {
    console.log("AMQP:Closed");
});
...