Nodejs Nestjs消息队列插件nestjs-rabbitmq的使用

Nodejs Nestjs消息队列插件nestjs-rabbitmq的使用
nestjs-rabbitmq 是一个用于 NestJS 的 RabbitMQ 消息队列插件。它可以帮助你在 NestJS 应用中轻松地实现消息的发送和接收。下面是一个简单的示例,展示如何在 NestJS 项目中使用 nestjs-rabbitmq

安装

首先,你需要安装 nestjs-rabbitmq 和 RabbitMQ 的相关依赖:

npm install @golevelup/nestjs-rabbitmq @golevelup/nestjs-fork @nestjs/microservices

配置 RabbitMQ 连接

在你的 NestJS 项目中创建一个配置文件,比如 rabbitmq.config.ts:

import { RabbitMqOptions } from '@golevelup/nestjs-rabbitmq';

export const rabbitmqConfig: RabbitMqOptions = {
  uri: 'amqp://localhost',
  noAck: false,
  queue: 'testQueue',
  queueOptions: {
    durable: true,
  },
};

注册 RabbitMQ 模块

在你的模块文件(例如 app.module.ts)中注册 RabbitMQ 模块,并提供配置:

import { Module } from '@nestjs/common';
import { RabbitMqModule } from '@golevelup/nestjs-rabbitmq';
import { rabbitmqConfig } from './rabbitmq.config';

@Module({
  imports: [
    RabbitMqModule.forRootAsync(rabbitmqConfig),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

创建消费者

创建一个服务来处理消息。例如,创建 message.consumer.ts:

import { MessagePattern, Payload } from '@nestjs/microservices';
import { AppService } from './app.service';

export class MessageDto {
  message: string;
}

@Injectable()
export class MessageConsumer {
  constructor(private readonly appService: AppService) {}

  @MessagePattern('testQueue')
  handleMessage(@Payload() data: MessageDto) {
    console.log(`Received message: ${data.message}`);
    // 处理消息逻辑
  }
}

创建生产者

创建一个服务来发送消息。例如,创建 message-producer.service.ts:

import { Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';

@Injectable()
export class MessageProducerService {
  constructor(private readonly client: ClientProxy) {}

  sendMessage(message: string) {
    this.client.emit('testQueue', { message });
  }
}

在控制器中使用

在你的控制器中使用 MessageProducerService 发送消息:

import { Controller, Get } from '@nestjs/common';
import { MessageProducerService } from './message-producer.service';

@Controller()
export class AppController {
  constructor(private readonly messageProducerService: MessageProducerService) {}

  @Get()
  async sendMessage() {
    this.messageProducerService.sendMessage('Hello, RabbitMQ!');
  }
}

这样,你就完成了一个基本的 NestJS 应用与 RabbitMQ 的集成。你可以通过访问 / 路径来触发消息发送,并在控制台看到消息被消费的日志输出。


3 回复

当然,NestJS 的 nestjs-rabbitmq 插件让消息队列变得像兔子一样灵活!首先,你需要给你的项目注入“魔法”——安装依赖:

npm install @golevelup/nestjs-rabbitmq --save

然后,在你的模块中,就像变魔术一样,配置你的RabbitMQ连接:

import { Module } from '@nestjs/common';
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';

@Module({
  imports: [
    RabbitMQModule.forRoot(RabbitMQModule, {
      uri: 'amqp://localhost',
      exchanges: [
        {
          name: 'my-exchange',
          type: 'direct',
        },
      ],
    }),
  ],
})
export class AppModule {}

现在你可以创建一个“魔法通道”,发送和接收消息了。比如,发送消息:

import { Injectable } from '@nestjs/common';
import { ClientRabbitMQ } from '@nestjs/microservices';

@Injectable()
export class AppService {
  constructor(private readonly client: ClientRabbitMQ) {}

  sendMessage() {
    this.client.emit('my-routing-key', { message: 'Hello, RabbitMQ!' });
  }
}

接收消息呢?就像兔子听到了胡萝卜的声音,设置监听器:

import { MessagePattern } from '@nestjs/microservices';

export class AppService {
  @MessagePattern({ cmd: 'get_message' })
  getMessage(data: any) {
    console.log(data); // 处理接收到的消息
  }
}

这样,你就成功地与RabbitMQ“对话”了!


nestjs-rabbitmq 是一个用于 NestJS 的 RabbitMQ 消息队列插件,可以帮助你在 NestJS 应用中轻松地实现发布/订阅模式和工作队列模式。下面我将向你展示如何设置和使用 nestjs-rabbitmq

安装依赖

首先,你需要安装 nestjs-rabbitmq 和相关依赖:

npm install @golevelup/nestjs-rabbitmq
npm install amqplib --save

配置 RabbitMQ

接下来,我们需要在你的 NestJS 项目中配置 RabbitMQ 连接。你可以创建一个模块来管理 RabbitMQ 的连接和通道。

创建 RabbitMQModule

在你的项目中创建一个新的模块,比如 rabbitmq.module.ts:

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'RABBITMQ_CLIENT',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://localhost:5672'], // RabbitMQ 地址
          queue: 'test_queue',             // 队列名
          queueOptions: {
            durable: false,
          },
        },
      },
    ]),
  ],
  exports: [ClientsModule],
})
export class RabbitmqModule {}

使用客户端

接下来,在你需要使用 RabbitMQ 的服务或控制器中注入 RABBITMQ_CLIENT

发布消息

在控制器或服务中注入客户端并发布消息:

import { Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';

@Injectable()
export class MessageService {
  constructor(private readonly client: ClientProxy) {}

  sendMessage(message: string) {
    this.client.emit('message', message);
  }
}

接收消息

为了接收消息,你需要在服务中定义一个处理器:

import { Injectable } from '@nestjs/common';
import { OnRpcNotification } from '@nestjs/microservices';

@Injectable()
export class MessageConsumerService {
  @OnRpcNotification({ event: 'message' })
  handleMessage(message: string) {
    console.log(`Received message: ${message}`);
  }
}

在主应用模块中引入 RabbitMQModule

最后,确保在你的主应用模块(通常是 app.module.ts)中引入 RabbitmqModule

import { Module } from '@nestjs/common';
import { RabbitmqModule } from './rabbitmq/rabbitmq.module';
import { MessageService } from './message.service';

@Module({
  imports: [RabbitmqModule],
  providers: [MessageService],
})
export class AppModule {}

以上步骤展示了如何在 NestJS 应用中使用 nestjs-rabbitmq 插件。你可以根据需要调整 RabbitMQ 的配置和处理逻辑。

NestJS RabbitMQ 插件用于在项目中集成RabbitMQ消息队列。首先,安装@golevelup/nestjs-rabbitmq包。然后,在模块中配置连接字符串和交换机等。创建服务以发送和接收消息,利用@RabbitSubscribe@RabbitmqConnect装饰器定义消息处理逻辑和连接设置。例如,通过@RabbitSubscribe监听特定队列的消息,并执行相应的业务逻辑。更多细节可参考官方文档或库的GitHub页面。

回到顶部