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;
}