ListenerExecutionFailedException消费rabbitMQ队列中消息出错导致刷屏

本文主要是介绍ListenerExecutionFailedException消费rabbitMQ队列中消息出错导致刷屏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method 'public void hospital.receiver.HospitalReceiver.receiver(hospital.vo.order.OrderMqVo,org.springframework.amqp.core.Message,com.rabbitmq.client.Ch

错误类型:org.springframework.amqp.rabbit.support.ListenerExecutionFailedException

annel) throws java.io.IOException' threw exception

在做一个尚医通项目时,需要用rabbitMQ处理用户的订单消息。然后就出现了刷屏,网上找了一些方法,都没法解决。研究了一段时间,解决了。下面是我的解决办法:

首先我的错误出现的原因是消息接受器无法处理队列中的消息,导致队列中消息无法被消费,接收器又一直去消费,陷入了死循环,导致了刷屏。

 解决办法. 修改两个地方的BUG

1.HospitalReceiver 中的receiver方法

//错误代码
Schedule schedule = scheduleService.getScheduleId(orderMqVo.getScheduleId());
产生原因: .getScheduleId 
课件上两次更新操作用的同一个方法根据scheduleId查,但是预约下单更新里的scheduleId是前端传过来的值,那个对应mongodb里的字段是_id;取消预约更新里的scheduleId是我们根据mysql查询科室查出来的排班id,对应mongodb里的字段是hosScheduleId;那都1用repository.findById(id).get();后者就会查不到数据,而Optionl没有经过ofNullable()就获取对象,如果对象为空的就会报错。
mq为什么循环报错这个有解释:

https//blog.csdn.net/lCSDNkingdoml/article/details/120425567:

解决方法:

1.HospitalReceiver 中的receiver方法

//订单消费者!
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = MqConst.QUEUE_ORDER, durable = "true"),exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_ORDER),key = {MqConst.ROUTING_ORDER}
))
public void receiver(OrderMqVo orderMqVo, Message message, Channel channel) throws IOException {// 如果orderMqVo 为空则,不进行任何操作if(orderMqVo == null){return;}if(null != orderMqVo.getAvailableNumber()) {//下单成功更新预约数Schedule schedule = scheduleService.getScheduleReceiver(orderMqVo.getScheduleId());schedule.setReservedNumber(orderMqVo.getReservedNumber());schedule.setAvailableNumber(orderMqVo.getAvailableNumber());scheduleService.updateSchedule(schedule);//预约成功发送预约成功的短信通知MsmVo msmVo = orderMqVo.getMsmVo();if(null != msmVo) {//短信消息生成者! 生成短信信息到消息队列rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_MSM, MqConst.ROUTING_MSM_ITEM, msmVo);}} else {//取消预约更新预约数Schedule schedule = scheduleService.getScheduleReceiver(orderMqVo.getScheduleId());int availableNumber = schedule.getAvailableNumber().intValue() + 1;schedule.setAvailableNumber(availableNumber);scheduleService.updateSchedule(schedule);//取消预约可以做专门发送取消预约的短信通知,这里就不做了!}
}

1.2. 添加OrderServiceImple

// 根据排班的 hosScheduleId ,获取排班的详情
@Overridepublic Schedule getScheduleReceiver(String hosScheduleId) {//会导致 取消预约更新预约数MQ刷屏报错Schedule schedule = scheduleRepository.getScheduleByHosScheduleId(hosScheduleId);return this.packageSchedule(schedule);} 

1.3 最后在 rabbitMq管理web界面,清空队列    
Web管理界面
http://虚拟机IP:15672/#
账号密码都是 guest

2. 修改OrderServiceImpl类中public Long saveOrder(String scheduleId, Long patientId) 生成挂号订单 

//发送mq消息,号源更新和短信通知
//发送mq信息更新号源 错误的代码

OrderMqVo orderMqVo = new OrderMqVo();
orderMqVo.setScheduleId(scheduleId);  错误的
orderMqVo.setReservedNumber(reservedNumber);
orderMqVo.setAvailableNumber(availableNumber);

//正确的代码

OrderMqVo orderMqVo = new OrderMqVo();
orderMqVo.setScheduleId(scheduleOrderVo.getHosScheduleId());
orderMqVo.setReservedNumber(reservedNumber);
orderMqVo.setAvailableNumber(availableNumber);

错误原因:orderMqVo.setScheduleId(scheduleId); 保存的是传入的645ddd513d3a8a69f73a6a85
而我们 HospitalReceiver 中的receiver方法参数OrderMqVo的scheduleId 就是保存订单时候传入的scheduleId。而我们需要的hosScheduleId

修改之前:

 修改后:

这篇关于ListenerExecutionFailedException消费rabbitMQ队列中消息出错导致刷屏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_57629110/article/details/130808927
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/577923

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C