我正在构建一个应用程序,其中的微服务通过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:设备},但错误仍然存在。
5条答案
按热度按时间zi8p0yeb1#
我有同样的错误,今天终于解决了。
在我的项目中,有一个api网关作为一个混合应用程序来接收请求并将数据传递给其他系统,每隔一个请求就会出现如下错误。
错误:远程服务中没有定义匹配的消息处理程序。
然后,我尝试删除下面代码中的api-gateway混合应用程序范围,错误消失了,希望这能帮助您解决此问题。
nwsw7zdq2#
我在不使用RabbitMQ时遇到了这个错误。我在网上发现很少有关于这个错误信息的帮助,除了它与RabbitMQ有关。
对我来说,这是一个问题,我从我的微服务的控制器中的另一个微服务导入一个DTO。我的微服务中有一个新的DTO,它的名称与另一个微服务中的名称相似。我不小心从自动列表中选择了错误的名称。
因为没有任何真正的指标表明我的构建是坏的,只有这个错误,我想分享的情况下,其他人犯了同样的错误,我没有。
gupuwyp23#
我今天遇到了同样的问题,在网上找不到任何解决方案,偶然发现了你的问题。我用一种黑客的方式解决了它,不确定当应用程序扩展时它会如何表现。
我基本上在生产者微服务本身的控制器中添加了一个@EventPattern(在您的例子中是@MessagePattern),并且我调用了client.emit()函数两次。
所以基本上第一次它被生产者本身的函数消费,第二次实际上是被消费者消费,这样一个POST调用就足够了。
生成器控制器:
生成器客户端:
p3rjfoxz4#
我在另一个项目中也遇到过同样的错误,经过一些研究,我发现问题出在RabbitMQ中的消息分发方式上--名为循环调度。在我的第一个项目中,我通过创建第二个队列解决了这个问题,在我的第二个项目中,我使用了package @golevelup/nestjs-rabbitmq而不是默认的NestJS库,因为它更容易配置。我推荐阅读this question
yqyhoc1h5#
我通过将@EventPattern装饰器放在@Controller装饰器方法上来解决这个问题