Мне нужно отправить данные через тему обмена 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' });
}