当前位置: 首页 > news >正文

Spring整合RabbitMQ消息类型转换踩坑记录

错误描述

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:155)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1665)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1584)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1572)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1563)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1507)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:967)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:914)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:83)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1291)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1197)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.amqp.AmqpException: No method found for class java.util.LinkedHashMap
at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getHandlerForPayload(DelegatingInvocableHandler.java:207)
at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getMethodFor(DelegatingInvocableHandler.java:339)
at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.getMethodFor(HandlerAdapter.java:117)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:205)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:146)

配置信息

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setMessageConverter(new FastJsonMessageConverter(Object.class));return factory;}@Bean@Scope("prototype")@Primarypublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate template = new RabbitTemplate(connectionFactory);template.setMessageConverter(new FastJsonMessageConverter(Object.class));template.setReturnsCallback(returned -> log.debug("RabbitTemplate ReturnsCallback : {}", returned));template.setConfirmCallback((CorrelationData correlationData, boolean ack, String cause) -> log.debug("RabbitTemplate ConfirmCallback : CorrelationData = {}, ack = {}, cause = {}", correlationData, ack, cause));template.afterPropertiesSet();return template;}

对SimpleRabbitListenerContainerFactory和RabbitTemplate都添加了FastJsonMessageConverter类型的转换器。

发送端代码

/*** 默认消息发送** @param exchange* @param queueName* @param object*/public void convertAndSend(String exchange, String queueName, final Object object) {rabbitTemplate.convertAndSend(exchange, queueName, object);}

object为具体类型,非json转换后的字符串。

消费端代码

@Component
@RabbitListener(queues = "")
public class MonitorHandleConsumer {@RabbitHandlerpublic void process(MQMessage<String> mqMessage) {}
}

原因分析

因为我们配置了FastJsonMessageConverter,然后消费端在类上添加了RabbitListener注解

  1. com.imooc.amqp.FastJsonMessageConverter的fromMessage()得到com.alibaba.fastjson.JSONObject类型
  2. org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter的invokeHandlerAndProcessResult()根据JSONObject类型来查找对应的方法,结果没找到,因为我们的方法参数为MQMessage类型。

解决方法

两种方法

  1. 将RabbitListener注解标注在方法上,这样就不会根据参数类型来查找方法了。
  2. 去除FastJsonMessageConverter类型的转换器,消息发送是转换层json字符串,消费端方法参数也为字符串
http://www.jsqmd.com/news/566858/

相关文章:

  • 2026年创业热搜:格行随身WiFi3.0代理模式全解析 - 格行官方招商总部
  • 2026年目前优质的翻卷机实力厂家哪家好,模具翻转机/翻卷机/栈板更换机/托盘缠绕机/翻转机,翻卷机实力厂家口碑推荐 - 品牌推荐师
  • 不只是原理图:深入解读无刷电机FOC硬件电路中的那些‘为什么’(以STM32和CAN通讯为例)
  • NoFences:让混乱桌面秒变高效工作区的开源桌面管理工具
  • 深入剖析RTC_WaitForSynchro()死循环问题及高效解决方案
  • 今天发生的两起安全事件:axios被投毒、Claude源码外泄
  • 别只盯着深度学习!用OpenCV传统CV算法实现答题卡识别,原理清晰代码少
  • MaopaiJd Tailscale 异地组网
  • 3.31(外加:构建之法阅读笔记03)
  • E-Hentai Downloader:绕过GP限制的免费图库批量下载解决方案
  • SYSU-MM01跨模态行人重识别:Python评估实战指南
  • Maxwell Fields Calculator双模式切换指南:堆栈与代数表达式输入实战解析
  • Obsidian LiveSync 终极指南:轻松实现自托管笔记多设备同步
  • 2000-2024年上市公司城市群政策DID
  • 终极指南:简单禁用Mac Turbo Boost功能,快速降低CPU温度20℃
  • 7步掌握GanttProject:免费开源甘特图工具全攻略
  • Phi-3-mini-4k-instruct-gguf效果展示:q4量化下保持语义准确性的中文生成实录
  • ISO/SAE 21434:2021 合规审核清单
  • Obsidian LaTeX Suite终极指南:让数学公式编辑如行云流水
  • day23-N8N-Wechat相关
  • 着力即差-东坡先生遗言
  • 微信聊天记录的数据备份与管理解决方案:WeChatMsg工具全解析
  • 三步解决Windows 11卡顿难题:开源工具Win11Debloat让系统效率提升3倍
  • 先抛个干货:这个改进版的黑猩猩优化算法SLWChoA,新手照着敲就能跑,而且效果比原版和不少老算法都强
  • 工业现场ModBus-RTU协议实战解析(基于RS-485物理层)
  • 告别双系统:在Windows 11上无缝体验Ubuntu 24.04的完整指南
  • ZYNQ7010双网口RGMII配置实战:RTL8211I-CG PHY芯片调试全记录(附动态调试技巧)
  • C++,OpenCV,VS2015,HOG+SVM行人检测项目一整套,具体包括以下内容: 1...
  • Windows/Mac双平台实测:FORCE PRO 6.3.0求解器从注册到下载的完整配置流程
  • 智能资源解析引擎:跨平台网络资源获取解决方案