【问题标题】:How to send RPC replyTo - NestJs Rabbitmq如何发送 RPC 回复 - NestJs Rabbitmq
【发布时间】:2020-05-03 21:36:26
【问题描述】:

我有一个简单的 NestJs 微服务应用程序,它正在侦听来自 Rabbitmq 服务的消息。

async function bootstrap() {
  dotenv.config();
  // TODO: Check for ENV valid
  const rabbitOptions = {
    urls: [`amqp://${process.env.MQ_HOSTNAME}:${process.env.MQ_PORT}`],
    queue: process.env.TASK_QUEUE_NAME,
    queueOptions: { durable: false },
  };
  const app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.RMQ,
    options: rabbitOptions,
  });
  await app.listen(() => console.log(`listening...`));
}
bootstrap();

...

@MessagePattern()
async respondQueue(@Payload() payload: AppleDto, @Ctx() context: RmqContext): Promise<any> {
  console.log('received message', payload);
  console.log(context.getArgs()[0].properties);
  return { response: 'wow' };
}

当我从 Rabbitmq UI 发布时,它会很好地使用消息。

但是我在另一个队列上回复消息没有成功。

不确定这是不受支持还是我做错了什么。

【问题讨论】:

    标签: rabbitmq nestjs


    【解决方案1】:

    我在同一个问题上被困了好几天。 如果负载包含id 字段,NestJS RabbitMQ 微服务只会将响应发送回reply_to 队列。否则,响应永远不会发送回 RabbitMQ。

    在你的情况下,替换:

    { "data": "apples" }
    

    作者:

    { "id": "apples233", "data": "apples" }
    

    完整地说,我在观察 NestJS RabbitMQ 生产者和消费者之间的双向通信时注意到的是,生产者发送到队列的消息是这样格式化的:

    属性

    reply_to = amq.rabbitmq.reply-to
    correlation_id = <uuid>
    

    有效载荷

    {
      "id": "<the same uuid as for the correlation_id property>",
      "pattern": "<the string you'll set in the MessagePattern decorator>",
      "data":
      {
        ...
      }
    }
    

    reply_toamq.rabbitmq.reply-to 值触发 RabbitMQ 的直接回复功能,但如果您希望响应进入您选择的预定义队列,您可以输入任何其他值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 2012-09-16
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2016-06-19
      相关资源
      最近更新 更多