Spring Boot集成RocketMQ之消息对象序列化

以下源码基于rocketmq-spring-boot-start 2.1.1版本,其它版本可能会有差异

一. 前言

当我们在Spring Boot项目中集成RocketMQ后,只需要在配置文件(application.yml)中添加rocketmq的相关配置,即可使用rocketMQTemplate发送对象消息。登录RocketMq Dashborad查看消息会发现我们的对象消息被序列化成json串。那它是使用哪种json序列化工具的呢?

二. 如何序列化

第一步,Spring Boot将Object封装成Message对象,但此时Object还没有被序列化。

第二步,将Spring Boot封装的Message对象转换成RocketMQ的Message对象,在此过程中进行序列化操作。

最终通过messageConverter将Spring Boot的Message对象转换成json串,然后构建RocketMQ的Message对象。那messageConverter从哪里来的呢?

三. Spring Boot加载MessageConverter

在rocketmq-spring-boot的jar包中有spring.factories和spring-autoconfigure-metadata.properties两个配置文件。spring.factories中指定了rocketmq的自动装配类RocketMQAutoConfiguration。spring-autoconfigure-metadata.properties中指定了在装配RocketMQAutoConfiguration前必需先装配MessageConverterConfiguration。

先看RocketMQAutoConfiguration配置类,该配置类中装配了我们发送MQ消息的模板类RocketMQTemplate

装配RocketMQTemplate需要依赖RocketMQMessageConverter,该类则是由MessageConverterConfiguration进行装配。

这里直接new了一个RocketMQMessageConverter。

在RocketMQMessageConverter的构造方法中为我们构造了一个CompositeMessageConverter, 而CompositeMessageConverter实际是多个MessageConverter的组合类。其中依次添加了ByteArrayMessageConverter、StringMessageConverter、MappingJackson2MessageConverter、MappingFastJsonMessageConverter四个消息转换类。

在使用CompositeMessageConverter进行消息序列化时依次使用以上四个消息转换类进行消息对象的序列化,若序列化成功则直接返回,否则继续使用下一个MessageConverter对消息进行序列化。

四. 总结

Spring Boot在装配RocketMQTemplate时为我们提供了四种消息对象转换类,当发送消息时依次有序的使用四种消息转换类对消息进行序列化,直到找到一个合适的消息转换类。在Spring Boot中一般都会集成JackSon,所以在没有特别配置时,发送的消息会使用JackSon序列化为json串。

五. 扩展

在MessageConverterConfiguration自动装配类中有ConditionalOnMissingBean注解,故在实际应用中若需要自定义消息对象的序列化方式,则可以自己装配RocketMQMessageConverter。

相关推荐
黑胡子大叔的小屋2 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
计算机毕设孵化场3 小时前
计算机毕设-基于springboot的校园社交平台的设计与实现(附源码+lw+ppt+开题报告)
spring boot·课程设计·计算机毕设论文·计算机毕设ppt·计算机毕业设计选题推荐·计算机选题推荐·校园社交平台
苹果醋33 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
小马爱打代码5 小时前
Spring Boot 中 Map 的最佳实践
java·spring boot·spring
全栈开发帅帅6 小时前
基于springboot+vue实现的博物馆游客预约系统 (源码+L文+ppt)4-127
java·spring boot·后端
m0_748255656 小时前
Springboot基于Web的景区疫情预警系统设计与实现5170q(程序+源码+数据库+调试部署+开发环境)
前端·数据库·spring boot
平行线也会相交7 小时前
云图库平台(三)——后端用户模块开发
数据库·spring boot·mysql·云图库平台
lxyzcm7 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
励碼8 小时前
Spring Security 6.3 权限异常处理实战解析
spring boot
m0_748257189 小时前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端