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队列中消息出错导致刷屏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577923

相关文章

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time