当前位置: 首页 > 知识库问答 >
问题:

NestJS microservices错误,“没有匹配的消息处理程序”

赖俊
2023-03-14

我正在构建一个应用程序,其中微服务通过RabbitMQ(请求-响应模式)进行通信
一切正常,但我仍然有一个错误“远程服务中没有定义匹配的消息处理程序。”-
当我向客户端应用程序发送帖子时,它只需通过客户端(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';
  }

客户端的RMQ设置为queueOptions:{持久:true},而消费者的queueOptions:{持久:true}设置为noAck:false,请确定问题的原因?我尝试用JSON发送数据。字符串化并将消息结构更改为{数据:设备},但错误仍然存在。

共有3个答案

戈念
2023-03-14

我今天遇到了同样的问题,在网上找不到任何解决方案,偶然发现了你的问题。我以一种黑客的方式解决了这个问题,但不确定当应用程序扩展时它会如何运行。

我基本上在producer微服务本身的控制器中添加了一个@EventPattern(在您的例子中是@MessagePattern)。我打电话给客户。emit()函数两次。

因此,本质上,它第一次被生产者本身的函数所消费,第二次发射实际上是给实际消费者的。这样一来,只需一个电话就足够了。

生产者控制器:

@EventPattern('video-uploaded')
  async test() {
    return 1;
  }
长孙智刚
2023-03-14

我在不使用RabbitMQ时出错。除了与RabbitMQ相关的错误消息之外,我在网上几乎找不到任何帮助。

对我来说,这是一个问题,我从我的微服务控制器中的另一个微服务导入DTO。我的微服务中有一个新的DTO,它的名称与另一个微服务中的名称相似。我不小心从自动列表中选错了一个。

由于没有任何真正的指标表明我的构建很糟糕,只有这个错误,我想与大家分享一下,以防其他人也犯了我犯的同样的错误。

殳经略
2023-03-14

我也有同样的错误,今天终于解决了。
在我的项目中,有一个api网关作为混合应用程序来接收请求并将数据传递给其他系统,每秒钟请求都会出现如下错误。

错误:远程服务中没有定义匹配的消息处理程序。

然后我尝试删除下面代码中的api网关混合应用程序范围,错误消失了,希望这能帮助您解决这个问题。

 // 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);
 类似资料:
  • 版本 维特。x核心:3.5.0 vert. x redis客户端:3.5.0 上下文 2018-06-02 17:40:55.981错误4933---[ntlop-thread-2]io.vertx.redis.impl.重新连接:没有处理程序等待消息:14751915 2018-06-02 17:41:10.937错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl

  • 我试图通过使用Jms Qpid客户端的Spring Boot应用程序使用Apache Qpid。我可以对其进行配置,但当我尝试从队列接收消息时,记录器正在打印: 这是我的代码: JMS配置。Java语言 应用属性 schduledTask.java它只是按间隔运行发送和接收消息。

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 我需要检查是否一个url是有效的和空值是可接受的以及。我是这个图书馆的新手,被这个错误难倒了。

  • 我正在homedepot.com练习,现在我有这样的问题卡住了,错误信息是:“Arity不匹配:步骤定义'StepsTestCase.SearchShoppingStep.click文件中的_close_button_in_add_to_cart_window(WebDriver):/C:/用户/管理员/git/MavenProject/目标/类/'带有模式[^在添加到购物车窗口中单击关闭按钮$]