rabbitmq NestJS微服务错误,“没有匹配的消息处理程序”

rm5edbpk  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(5)|浏览(388)

我正在构建一个应用程序,其中的微服务通过RabbitMQ(请求-响应模式)进行通信。
一切正常,但仍有问题,错误为***“There is no matching message handler defined in the remote service."*-
当我向我的客户端应用程序发送POST时,它应该只是通过客户端发送带有数据的消息(ClientProxy)和消费者应用程序应响应。此
功能实际工作**,但是总是只有第二次。我知道这听起来很奇怪,但是在我的第一次POST请求中总是有来自客户端的错误,我的每第二次POST请求都能工作。然而,这个问题在我的整个应用程序中无处不在,所以特定的POST请求只是作为示例。
下面是代码:

  • 客户:*
@Post('devices')
async pushDevices(
    @Body(new ParseArrayPipe({ items: DeviceDto }))
    devices: DeviceDto[]
    ) {
    this.logger.log('Devices received'); 
    return this.client.send(NEW_DEVICES_RECEIVED, devices)
}
  • 消费者:*
@MessagePattern(NEW_DEVICES_RECEIVED)
 async pushDevices(@Payload() devices: any, @Ctx() context: RmqContext) {
    console.log('RECEIVED DEVICES');
    console.log(devices);
    const channel = context.getChannelRef();
    const originalMsg = context.getMessage();
    channel.ack(originalMsg);
    return 'ANSWER';
  }

客户端具有带 queueOptions的RMQ设置:{durable:true} 以及使用者 * 队列选项:{持久:true}* 不确认:错误 *
请问您知道是什么原因导致了这个问题吗?我试过用JSON.stringify发送数据,并将消息结构更改为{data:设备},但错误仍然存在。

zi8p0yeb

zi8p0yeb1#

我有同样的错误,今天终于解决了。
在我的项目中,有一个api网关作为一个混合应用程序来接收请求并将数据传递给其他系统,每隔一个请求就会出现如下错误。
错误:远程服务中没有定义匹配的消息处理程序。
然后,我尝试删除下面代码中的api-gateway混合应用程序范围,错误消失了,希望这能帮助您解决此问题。

// api-gateway main.ts

  const app = await NestFactory.create(AppModule);

  // run as a hybrid app —→ remove it
  app.connectMicroservice({
    transport: Transport.RMQ,
    noACK: false,
    options: {
      urls: [`amqp://${rmqUser}:${rmqPassword}@127.0.0.1:5672`],
      queue: 'main_queue',
      queueOptions: {
        durable: false,
      },
    },
  });

  // run hybrid app
  await app.startAllMicroservices(); —→ remove it
  await app.listen(3000);
nwsw7zdq

nwsw7zdq2#

我在不使用RabbitMQ时遇到了这个错误。我在网上发现很少有关于这个错误信息的帮助,除了它与RabbitMQ有关。
对我来说,这是一个问题,我从我的微服务的控制器中的另一个微服务导入一个DTO。我的微服务中有一个新的DTO,它的名称与另一个微服务中的名称相似。我不小心从自动列表中选择了错误的名称。
因为没有任何真正的指标表明我的构建是坏的,只有这个错误,我想分享的情况下,其他人犯了同样的错误,我没有。

gupuwyp2

gupuwyp23#

我今天遇到了同样的问题,在网上找不到任何解决方案,偶然发现了你的问题。我用一种黑客的方式解决了它,不确定当应用程序扩展时它会如何表现。
我基本上在生产者微服务本身的控制器中添加了一个@EventPattern(在您的例子中是@MessagePattern),并且我调用了client.emit()函数两次。
所以基本上第一次它被生产者本身的函数消费,第二次实际上是被消费者消费,这样一个POST调用就足够了。
生成器控制器:

@EventPattern('video-uploaded')
  async test() {
    return 1;
  }

生成器客户端:

async publishEvent(data: VideosDto) {
    this.client.emit('video-uploaded', data);
    this.client.emit('video-uploaded', data);
}
p3rjfoxz

p3rjfoxz4#

我在另一个项目中也遇到过同样的错误,经过一些研究,我发现问题出在RabbitMQ中的消息分发方式上--名为循环调度。在我的第一个项目中,我通过创建第二个队列解决了这个问题,在我的第二个项目中,我使用了package @golevelup/nestjs-rabbitmq而不是默认的NestJS库,因为它更容易配置。我推荐阅读this question

yqyhoc1h

yqyhoc1h5#

我通过将@EventPattern装饰器放在@Controller装饰器方法上来解决这个问题

相关问题