nestjs-rmq
nestjs-rmq copied to clipboard
Determine serviceName on @RMQRoute
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, 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.