优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路1

Springboot下RabbitMQ 封装实现,支持点对点消息,广播消息、延时消息 如何避免项目中消息队列使用泛滥,大量重复代码和逻辑无处不再,数据跟踪困难,代码维护心累,您可以看看这个小工具。 阅读详情

首先说一句我打脸了,Spring-AMQP 1.6之后就支持参数类型推断了,不需要这样麻烦,只要升级就行了。这套逻辑是我为了Spring-AMQP 1.3.9写的,但是最近写文章的时候,是看的Spring-AMQP-1.7.4的源码(新旧项目兼容,我是为了旧项目写的功能,但是写文章到时候看的是新的项目,尴尬)。我写的时候还在想为什么代码不跟印象里不一样了, 由于实在太晚了,就大概看看,没有仔细研究。今天2020-06-14,在研究写方案三的时候,经过仔细研读源码,发现了疏漏,就赶紧改一下,省的误导大家。
如果大家无法升级Spring-AMQP,还得用老版本,这个文章对大家还是有帮助的。

序

最近又充满的冲劲,打算再把博客捡起来,(っ•̀ω•́)っ✎⁾⁾ 我爱学习

原由

Spring-AMQP 支持 生产者 使用自定义的 Bean,然后通过 MessageConverter 转换成Message 进行发送。消费者 也可以通过 MessageConverter 将 Message再转化成自定义类。毕竟 Message 构建解析还是挺麻烦的。

MessageConverter有多个子类:

  • 通过 Java Serializable,String,纯byte[] 进行传递 :SerializerMessageConverter、SimpleMessageConverter
  • 通过 Xml 进行传递:MarshallingMessageConverter
  • 通过 Json 进行传递:JsonMessageConverter、Jackson2JsonMessageConverter
  • 包装其他的MessageConverter,根据 contentType 进行转发:ContentTypeDelegatingMessageConverter

其中Jackson2JsonMessageConverter 比较常用,使用 Jackson 2 进行转换(以下简称 JsonMessageConverter)。但是 MessageConverter 这个接口有个小问题,它为了封装最通用的转换逻辑,其中 fromMessage 只有一个参数,这导致无法获取 自定义 Bean 的 Class,消费者 就无法通过反射构建 Bean。

// 将自定义对象转成Message, 生产者
Message toMessage(Object object, MessageProperties messageProperties)
// 将Message转成自定义对象, 消费者
Object fromMessage(Message message)

所以JsonMessageConverter通过实现 AMQP 协议,填充 headers 中 __TypeId__ 的值,来传递 Class的Name。 它 的默认是 填充包括的包名的全称,说的直白点,那就是在不对它进行任何改造的前提下,发送消息的 Bean 和接受消息的 Bean 必须是一样的,不仅是要里面的字段一样,类名一样,连包名都要一样。

所以当 生产者 使用 JsonMessageConverter发送消息时,消费者 可以有如下几种方式来接收:

  • 消费者 和 生产者 依赖相同的 jar。
  • 不依赖jar,那就在自己系统建一个相同的 Class ,包名,类名都得相同。
  • 获取 Message,然后自己解析。

其中方案1,方案2 系统之间耦合性太强了,方案3 是个还可以方案,但是我被 SpringMVC 给惯坏了,感觉还是有点麻烦,就想自动转换成 Bean , 然后直接使用就行了。那我就开始研究源码,找到解决方案。

思路

上面已经说了,JsonMessageConverter 是通过填充 __TypeId__ 来实现 json 序列化和反序列化的,那我就找到对应的代码, 修改 __TypeId__ 就行了。虽然说得简单,但是我也是一步步分析源码找到的,接下来讲解我是如何一步步找到对应源码的。

消费者源码分析

首先我根据经验推断,从Message转成 Bean 的时候,必须知道对应 Bean 的Class ,不然不可能实现转换。然后找到了这段代码,特别好理解, targetJavaType 和 targetClass 明确的“暗示”它的作用,毕竟我也是手动创建 并使用过 ObjectMapper 的人(✪ω✪)。
那咱们打开 函数 convertBytesToObject 来验证猜测,看到了熟悉的代码,证明我们的猜测,jsonObjectMapper 就是 Jackson 2 ObjectMapper 的实例。
看到这块我特别的开心,这说明JsonMessageConverter没有什么神秘的,跟 咱们平时 通过 Class来解析 Json 没有什么区别,咱们接下去的目标,就是找到 Class 是如何获取的。

	@Override
	public Object fromMessage(Message message)
			throws MessageConversionException {
   
   
		// ……省略无关代码……
					if (getClassMapper() == null) {
   
   
						JavaType targetJavaType = getJavaTypeMapper()
								.toJavaType(message.getMessageProperties());
						content = convertBytesToObject(message.getBody(),
								encoding, targetJavaType);
					}
					else {
   
   
						Class<?> targetClass = getClassMapper().toClass(
								message.getMessageProperties());
						content = convertBytesToObject(message.getBody(),
								encoding, targetClass);
					}
		// ……省略无关代码……
	}

	private Object convertBytesToObject(byte[] body, String encoding, JavaType targetJavaType) throws IOException {
   
   
		String contentAsString = new String(body, encoding);
		return this.jsonObjectMapper.readValue(contentAsString, targetJavaType);
	}

	private Object convertBytesToObject(byte[] body, String encoding, Class<?> targetClass) throws IOException {
   
   
		String contentAsString = new String(body, encoding
SpringBoot+Vue集成J-IM开源框架,构建轻量级即时通讯模块实践 即时通讯(IM)作为现代应用的核心功能,其底层依赖于网络编程、长连接管理和实时数据传输协议。理解WebSocket等通信原理,是实现低延迟、双向通信的技术基础。在工程实践中,选择成熟的开源框架能有效降低开发复杂度,提升系统可控性。J-IM作为基于Netty的国产开源IM框架,封装了网络层细节,提供了连接管理、消息路由等核心能力,其价值在于为中小型项目提供了“够用且可控”的解决方案。结合SpringBoot的容器化管理和Vue的响应式前端,可以快速构建出支持实时收发消息、会话管理的聊天功能。这种技术组合适用于 阅读详情

相关推荐

SpringBoot集成LangChain4j构建生产级AI Agent

AI Agent 是大模型从单次调用迈向自主决策的关键范式,其核心在于会话管理、工具编排与状态持久化。LangChain4j 作为 Java 生态原生的 LangChain 实现,将 LLM 能力抽象为可注入、可配置、可监控的 Spring Bean,天然兼容自动装配、事务管理与 Actuator 指标体系。结合 SpringBoot 的约定优于配置理念,开发者能复用熟悉的 @Service、@Autowired 和 starter 机制,快速构建具备记忆能力(ChatMemory)、多模型切换(OpenA

weixin_30562507的博客 334

SpringBoot中RedisTemplate操作List数据结构:从基础API到实战场景详解

缓存是提升应用性能的核心技术之一,其原理是将高频访问的数据存储在内存中,以减少对数据库的直接访问,从而显著降低响应延迟并提升系统吞吐量。在Java生态中,SpringBoot通过Spring Data Redis提供了与Redis集成的标准化方案,其中RedisTemplate作为核心操作模板,封装了丰富的数据结构操作。List作为Redis的关键数据结构之一,凭借其有序、可重复及支持两端操作的特性,在工程实践中具有独特的技术价值。它非常适合需要维护顺序或实现队列/栈模型的场景,例如记录用户最近操作日志、实

weixin_30321449的博客 328

SpringBoot应用数据加密实战:从存储、传输到展示的全链路安全方案

数据加密是保障应用安全的核心技术之一,其核心原理在于通过特定算法将明文信息转换为不可读的密文,防止未授权访问。在Java生态中,SpringBoot框架因其便捷性被广泛用于构建企业级应用,而Jasypt作为成熟的Java加密库,提供了与SpringBoot无缝集成的能力,能有效对配置文件中的敏感信息进行加密。从技术价值看,合理的数据加密策略不仅能满足等保合规要求,更能构建纵深防御体系,保护用户隐私和商业数据。在实际应用场景中,数据安全需覆盖其完整生命周期:在存储层,可通过MyBatis-Plus插件实现数据

weixin_30905133的博客 380

Redis十大数据类型全解析:从原理到实战应用

在分布式系统和高性能服务架构中,键值存储是核心基础组件之一,它通过内存存储和高效数据结构实现快速数据访问。其原理基于内存操作和多样化的数据结构支持,能够显著提升应用性能并降低数据库负载。这一技术价值在于为缓存、会话存储、实时统计等场景提供了高并发解决方案。在应用场景上,从基础的字符串缓存到复杂的流处理,覆盖了计数器、排行榜、消息队列、地理位置服务等多种需求。本文聚焦Redis的十大数据类型,深入探讨String、Hash、List、Set、Sorted Set、GEO、Bitmap、HyperLogLog、

weixin_33861800的博客 432

SpringBoot电商秒杀系统:高并发库存扣减与防超卖实战

秒杀系统本质是高并发场景下对数据一致性和系统稳定性的极限考验。其核心原理在于通过数据库行锁、缓存一致性、消息队列削峰及后端风控拦截等多重机制,协同保障库存精确扣减与请求可控调度。技术价值体现在不依赖复杂中间件即可实现万级QPS下的零超卖、低延迟与高可用。典型应用场景包括大促抢购、限量发售、直播带货等瞬时流量洪峰业务。本文基于SpringBoot 2.7+Redis 6.2+RabbitMQ 3.11真实落地案例,深度解析库存预减、令牌桶限流、三级缓冲队列与设备指纹防刷等关键设计,尤其聚焦‘源代码’级实现细节

weixin_34275734的博客 384

基于SpringBoot与人脸识别技术构建高并发考勤系统后端实践

人脸识别作为计算机视觉的核心应用之一,其原理是通过算法模型提取人脸图像中的特征向量,并进行相似度比对,从而实现身份验证。这项技术因其非接触、便捷和安全性,在安防、金融支付和智能终端等领域价值显著。在企业管理场景中,传统考勤方式存在代打卡、效率低等问题,而集成人脸识别的智能考勤系统能有效提升管理效率和体验。本文聚焦于如何利用SpringBoot框架,高效集成人脸识别算法,设计并实现一个支持高并发请求的考勤系统后端。内容涵盖从系统架构设计、核心数据库表结构(如员工表、考勤记录表),到人脸注册、1:N识别比对等关

weixin_30616969的博客 504

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 入门基础 11.多选题 以下方式中属于FineReport中预览模式的有( ) 分页预览、填报预览、新填报预览、数据分析、移动端预览 16.判断题 FineReport报表工具必须购买激活码后才能使用。 错误,可以免费获取激活码。 29.单选题 FineReport是一款利用( )语言开发的报表工具。java 41.多选题 访问帮助文档的方式有哪些?设计器中社区菜单下-帮助文档;直接访问http://help.finere

qq_37485720的博客 2万+

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析

现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类和way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C

weixin_30263073的博客 611

骚操作,尝试使用Xilinx XVC协议,通过Jlink来下载调试Xilink zynq FPGA芯片

最近一直在玩zynq芯片,手头使用的Xilinx Platform USB Cable 下载线真是辣鸡,速度慢如蜗牛,每次下载bit文件或者烧写flash文件都要大半天,实在是难以忍受。逻辑分析仪看了下xilinx的下载线,速度只有6.25M,并且数据间隔非常大,不懂这线的开发者咋想的,这总线利用率真是低到爆了 上图为xilinx DLC 10下载线波形,惨不忍睹! 为了不浪费生命在下载等待时间上,我打算找找看有没有别的仿真调试选择。经过一番查找后发现Xilinx的仿真器好像选择不是很多,要么贵死要

听我瞎扯淡的博客 1万+

某银行大数据分析平台之云原生架构

软考架构师论文

doudoudouy的博客 768

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2845

MLNX_OFED 5.4-3.7.5.0 驱动安装:银河麒麟V10SP2 ARM 内核升级后编译避坑 3 步

本文详细介绍了在银河麒麟V10SP2 ARM环境下安装MLNX_OFED 5.4-3.7.5.0驱动的完整流程,包括内核升级后的驱动兼容性挑战、编译环境准备、分步编译与安装流程以及性能优化与故障排查。特别针对国产化ARM服务器(如华为Atlas系列)提供了实用的解决方案和常见问题处理建议,帮助用户顺利完成mlnx网卡驱动的安装与配置。

weixin_29184075的博客 403

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

SOME/IP协议详解「1.0·概述」

主要讲解什么是someip,

雪云飞星的博客 5367

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: Log4j日志存储到数据库——优化
下一篇: 优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路2
明日之春
博客等级 码龄15年 3粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值