nestjs-rmq icon indicating copy to clipboard operation
nestjs-rmq copied to clipboard

Determine serviceName on @RMQRoute

Open rnatto-gempe opened this issue 3 years ago • 1 comments

Hey, Thanks for this library and to solve my previous issue. 🚀

So, my question is:

how can i have multiples RMQModule at the same project?

I have 2 consumers. that listen 2 distinct queues

BAKERY CONSUMER

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { RMQModule } from 'nestjs-rmq';
import { BakeryConsumerController } from './bakery-consumer.controller';

@Module({
  imports: [
    RMQModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        return {
          exchangeName: configService.get('RABBITMQ_EXCHANGE'),
          connections: [
            {
              login: configService.get('RABBITMQ_DEFAULT_USER'),
              password: configService.get('RABBITMQ_DEFAULT_PASS'),
              host: configService.get('RABBITMQ_URL'),
            },
          ],
          serviceName: 'Bakery',
          queueName: 'bakery',
        };
      },
    }),
  ],
  controllers: [BakeryConsumerController],
})
export class BakeryConsumerModule {}

PHARMACY CONSUMER

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { RMQModule } from 'nestjs-rmq';
import { PharmacyConsumerController } from './pharmacy-consumer.controller';

@Module({
  imports: [
    RMQModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        return {
          exchangeName: configService.get('RABBITMQ_EXCHANGE'),
          connections: [
            {
              login: configService.get('RABBITMQ_DEFAULT_USER'),
              password: configService.get('RABBITMQ_DEFAULT_PASS'),
              host: configService.get('RABBITMQ_URL'),
            },
          ],
          serviceName: 'Pharmacy',
          queueName: 'pharmacy',
        };
      },
    }),
  ],
  controllers: [PharmacyConsumerController],
})
export class PharmacyConsumerModule {}

And when I declare a consumer inside each service, only the first module config is used. so ONLY the BAKERY queue is being listened.

Here my controllers

import { Controller } from '@nestjs/common';
import { RMQRoute } from 'nestjs-rmq';

@Controller('pharmacy-consumer')
export class PharmacyConsumerController {
  @RMQRoute('#')
  myMethod(message: any): any {
    console.log(message);
    return message;
  }
}
import { Controller } from '@nestjs/common';
import { RMQRoute } from 'nestjs-rmq';

@Controller('bakery-consumer')
export class BakeryConsumerController {
  @RMQRoute('#'})
  myMethod(message: any): any {
    console.log(message);
    return message;
  }
}

My suggestion is to use serviceName inside @RMQRoute like this

@RMQRoute('#', { serviceName: 'Bakery'})

There is another way to make this work on current version?

rnatto-gempe avatar Sep 16 '21 10:09 rnatto-gempe

@rnatto-gempe, hello! Currently not. This is because of lack non-global module support. Related to this issue: https://github.com/AlariCode/nestjs-rmq/issues/20.

To support this we need:

  • Add global flag for backward compatibility.
  • Add forFeature method for module, where you set connections for each individual module.
  • Add RMQmodule instance name (like serviceName, you described)
  • Use it in RMQ routes.
  • Use it to inject RMQService.

AlariCode avatar Sep 27 '21 05:09 AlariCode