我有一个简单的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发布消息时,它可以很好地使用消息。
但是我在不同的队列中回复邮件失败。
不确定这是不支持的还是我做错了什么。
2条答案
按热度按时间piv4azn71#
当我在模块中创建客户端时,我遇到了这个问题,我把队列作为一个参数,逻辑上,我也应该提供replyQueue。
看看下面的代码,然后我的意见。
我做了一个接口的小过程。在
ClientsModule
里面得到ClientsModuleOptions
。ClientsModuleOptions
实际上是ClientProvider
。ClientProvider
可以是ClientOptions
。ClientOptions
在Rabbitmq的情况下是RmqOptions
。在RmqOptions
下面,它是:因此,如果我按如下所示更新我的
app.module.ts
,replyQueue将是我的值。hlswsv352#
我已经在同一个问题上纠结了好几天了。NestJS RabbitMQ微服务只会在有效负载包含
id
字段时才将响应发送回reply_to
队列。否则,响应永远不会发送回RabbitMQ。在您的情况下,请更换:
签署人:
完整地说,在观察NestJS RabbitMQ生产者和消费者之间的双向通信时,我注意到生产者发送到队列的消息是这样格式化的:
reply_to
的amq.rabbitmq.reply-to
值触发RabbitMQ的Direct Reply-To特性,但是如果您希望响应进入您选择的预定义队列,则可以设置任何其他值。