RabbitMQ 消息转换器详解

RabbitMQ 消息转换器详解

一、为什么需要消息转换器?

RabbitMQ 的消息传输协议只识别字节流

  • 发送对象时,需要序列化成字节数组
  • 接收消息时,需要将字节数组反序列化成对象

如果不使用消息转换器

  • 需要手动序列化和反序列化,代码冗余且容易出错

使用消息转换器:

  • AMQP模板(RabbitTemplate)自动完成消息编码/解码
  • 减少样板代码,提高可维护性

二、Spring AMQP 常用消息转换器

转换器类 作用
SimpleMessageConverter 默认转换器,支持 Stringbyte[]Serializable
Jackson2JsonMessageConverter 使用 Jackson 将对象序列化为 JSON
SerializationMessageConverter 使用 Java 原生序列化机制
ContentTypeDelegatingMessageConverter 根据 contentType 动态选择转换器

三、默认消息转换器

Spring AMQP 默认使用 SimpleMessageConverter

  • 发送 String → UTF-8 编码为 byte[]
  • 发送 byte[] → 直接传输
  • 发送 Serializable 对象 → Java 原生序列化

缺点

  • 原生序列化体积大、性能一般
  • 可读性差(调试和跨语言支持差)

四、JSON 消息转换器

4.1 引入依赖

xml 复制代码
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

4.2 配置消息转换器

java 复制代码
@Bean
public MessageConverter messageConverter(){
    // 1.定义消息转换器
    Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
    // 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
    jackson2JsonMessageConverter.setCreateMessageIds(true);
    return jackson2JsonMessageConverter;
}