以下源码基于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。