在nestjs中使用rabbitmq

1.安裝rabbitmq: docker run -dit --name myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management

2.npm install amqplib amqp-connection-manager


3.subscribers.module.ts
import { Module } from '@nestjs/common'; import { SubscribersController } from './subscribers.controller'; import { SubscribeService } from 'src/modules/subscribers.service' import { ConfigModule, ConfigService } from '@nestjs/config'; import { ClientProxyFactory, Transport } from '@nestjs/microservices'; @Module({ imports: [ConfigModule], controllers: [SubscribersController], providers: [ { provide: 'SUBSCRIBERS_SERVICE', useFactory: () => { return ClientProxyFactory.create({ transport: Transport.RMQ, options: { urls: [`amqp://admin:admin@localhost:5672`], queue: 'my_queue2', noAck: false,//false,需要手動確認消息 queueOptions: { durable: true,//消息持久化 }, }, }) }, inject: [ConfigService], }, SubscribeService ], }) export class SubscribersModule { }




4.subscribers.controller.ts//發送消息

import { Body, Controller, Post, Inject, } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { SubscribeService } from 'src/modules/subscribers.service' @Controller('subscribers') export class SubscribersController { constructor( @Inject('SUBSCRIBERS_SERVICE') private subscribersService: ClientProxy, private service: SubscribeService ) { } @Post() async createPost(@Body() subscriber) { // this.service.createPost(subscriber) //省略數據庫存儲, return this.subscribersService.send({ cmd: 'add-subscriber' }, subscriber) } //省略定時任務重新發送 }

 



5.app.controller.ts //接受消息

import { Controller, Get, Inject, Body, Post } from '@nestjs/common';
import { AppService } from './app.service';
import { MessagePattern, Payload, Ctx, RmqContext } from '@nestjs/microservices';
@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,


  ) { }

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @MessagePattern({ cmd: 'add-subscriber' })
  async addSubscriber(@Payload() subscriber, @Ctx() context: RmqContext) {
    const channel = context.getChannelRef();
    const originalMsg = context.getMessage();
    //省略處理數據庫
    console.log('app.....get message is ', subscriber)
    channel.ack(originalMsg);
    return subscriber;
  }
}
6.main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport } from "@nestjs/microservices";
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.connectMicroservice({
    transport: Transport.RMQ,
    options: {
      urls: [`amqp://admin:admin@localhost:5672`],
      queue: 'my_queue2',
      noAck: false,
      queueOptions: { durable: true },
    },
  });
  app.startAllMicroservices();
  await app.listen(3000);
}
bootstrap();

7.目錄結構

 

 

總結:只能在controller中接受消息!!!!!,折騰了一下午,在service中發消息和接受消息,都不行,如有解決辦法,歡迎指導。。。 本文整理來自網絡,,確定可以跑通,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章