Как назначить соединение rabbitMQ свойству класса, чтобы использовать его в другой функции? - PullRequest
0 голосов
/ 10 апреля 2019

Итак, основная идея - создать класс Wrapper, который содержит некоторые функции, чтобы упростить использование функций rabbitmq для публикации, подписки и RPC.Например, цель состоит в том, чтобы, если я захочу опубликовать что-либо, я легко воспользуюсь функцией публикации внутри класса Rabbit Wrapper, для exp это будет выглядеть примерно так: var rabbit = new IRabbitMQ();, а затем для публикации я буду использовать функцию издателя rabbit.publisher(exchangeName, queueName, etc..) и если мне было интересно получить, я легко позвоню rabbit.subscriber(exchangeName, queueName, etc..)

Я попробовал все идеи, которые были у меня в голове, это не сработало с вложенными классами, потому что в js я не нашелУдобный способ сделать это, я попробовал также фабричные функции или простой объект и избегать использования классов, но это не сработало.Проблема всегда заключалась в том, что когда я устанавливаю соединение и создаю канал между мной и rabbitMQ, я не могу сохранить это соединение и канал в свойстве класса Wrapper, чтобы использовать его в другой функции, если я хочу

 class IRabbitMQ {

constructor() {
   this.init(rabbitMQServer); // this should initialize my this.connection and this.channel property to the connection and channel object but instead receive an error because there are undefined
 }

async init(host) {
    try {
        const connection = await amqplib.connect(host);
        const channel = await connection.createChannel();
        channel.prefetch(1);
        console.log(' [x] Awaiting RPC requests');
        this.connection = connection; // this should make a property connection with the connection object, when i console.log here it shows me the connection object but if i want to use this in another function it gaves me undefined value!
        this.channel = channel;
    }catch(err) {
        console.error(err);
    }
}

async publisher(queue, body) {

    let q = await this.channel.assertQueue(queue, {durable: false});

    this.channel.sendToQueue(q, Buffer.from(JSON.stringify(body)));

    console.log("msg sent ", body);
}

async subsriber(queue) {

    let q = await this.channel.assertQueue(queue, {durable: false});
    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);

    await  this.channel.consume(q, function(msg) {
        console.log(" [x] Received %s", msg.content.toString());
      }, {noAck: true});
}


}

   // another example using a simple object instead of a class
      /* var IRabbitMQ = {

channel : undefined, 

init : async (host) => {

    try {
        const connection = await amqplib.connect(host);
        const channel = await connection.createChannel();
        channel.prefetch(1);
        console.log(' [x] Awaiting RPC requests');
        this.channel = channel;

    }catch(err) {
        console.error(err);
    }
},

publisher : async (queue, body) =>{
    this.init(rabbitMQServer);
    let q = await this.channel.assertQueue(queue, {durable: false});

    this.channel.sendToQueue(q, Buffer.from(JSON.stringify(body)));

    console.log("msg sent ", body);
},

subscriber : async(queue) => {
    this.init(rabbitMQServer);
    let q = await this.channel.assertQueue(queue, {durable: false});
    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);

    await  this.channel.consume(q, function(msg) {
        console.log(" [x] Received %s", msg.content.toString());
      }, {noAck: true});
}

   } */

Ожидаемый вывод - я могу иметь доступ к значению соединения и канала, чтобы использовать его позже в других функциях, потому что в противном случае не будет смысла создавать класс Wrapper.если у вас, ребята, есть также лучшая идея из вашего опыта создания этого, которую было бы полезно услышать.

...