RabbitMQ 消息转换器详解
RabbitMQ 消息转换器详解
一、为什么需要消息转换器?
RabbitMQ 的消息传输协议只识别字节流:
- 发送对象时,需要序列化成字节数组
- 接收消息时,需要将字节数组反序列化成对象
如果不使用消息转换器:
- 需要手动序列化和反序列化,代码冗余且容易出错
使用消息转换器:
- 让
AMQP
模板(RabbitTemplate
)自动完成消息编码/解码 - 减少样板代码,提高可维护性
二、Spring AMQP 常用消息转换器
转换器类 | 作用 |
---|---|
SimpleMessageConverter | 默认转换器,支持 String 、byte[] 、Serializable |
Jackson2JsonMessageConverter | 使用 Jackson 将对象序列化为 JSON |
SerializationMessageConverter | 使用 Java 原生序列化机制 |
ContentTypeDelegatingMessageConverter | 根据 contentType 动态选择转换器 |
三、默认消息转换器
Spring AMQP 默认使用 SimpleMessageConverter
:
- 发送
String
→ UTF-8 编码为byte[]
- 发送
byte[]
→ 直接传输 - 发送
Serializable
对象 → Java 原生序列化
缺点
- 原生序列化体积大、性能一般
- 可读性差(调试和跨语言支持差)
四、JSON 消息转换器
4.1 引入依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
4.2 配置消息转换器
@Bean
public MessageConverter messageConverter(){// 1.定义消息转换器Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();// 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息jackson2JsonMessageConverter.setCreateMessageIds(true);return jackson2JsonMessageConverter;
}