можно добавить поддержку для обмена темами в клиенте nestjs rmq - PullRequest
0 голосов
/ 07 июля 2019

Мне нужно отправить данные через тему обмена RabbitMQ, и для этого я создаю RmqClient, который наследуется от ClientProxy, и с этим я могу повторно использовать метод отправки, в котором создается соединение.

Возможна ли тема поддержки, разветвление ... в native client-rmq ???

Мы создаем интерфейс для поддержки параметров обмена темами и метод, который получает RouingKey и данные в качестве аргументов.

Это наш код:

export interface RmqClientOptions {
  urls: string[];
  exchangeName: string;
  exchangeType: 'fanout' | 'topic';
  exchangeOptions?: any;
  socketOptions?: any;
}

@Module({})
export class RmqClientModule {
  static register(name: string, clientOptions: RmqClientOptions): DynamicModule {
    const client = {
      provide: name,
      useValue: new RmqClient(clientOptions),
    };
    return {
      module: RmqClientModule,
      providers: [client],
      exports: [client],
    };
  }
}
  //RmqClient

  public createChannel(): Promise<void> {
    return new Promise(resolve => {
      this.channel = this.client.createChannel({
        json: false,
        setup: (channel: any) => this.setupChannel(channel, resolve),
      });
    });
  }

  public async setupChannel(channel: any, resolve: Function) {
    await channel.assertExchange(this.exchangeName, this.exchangeType, this.exchangeOptions);
    resolve();
  }

  protected publish(packet: ReadPacket<any>, callback: (packet: WritePacket<any>) => any): Function {
    try {
//packet.pattern is our routingKey
      this.channel.publish(this.exchangeName, packet.pattern, Buffer.from(JSON.stringify(packet.data)));
      return () => true;
    } catch (err) {
      callback({ err });
    }
  }

  public sendSingleMessage(routingKey: any, data: any): Promise<any> {
    return this.send(routingKey, data).toPromise();
  }

}
//using the client
@Injectable()
export class AppService {

  constructor(@Inject('RMQ_CLIENT') private readonly client: RmqClient) { }

  sendMessage(): void {
    this.client.sendSingleMessage('error', { user: 'kako', message: 'user created' });
  }
...