周振林 周振林
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • Spring
  • SpringMVC
  • Mybatis
  • Docker
  • RabbitMQ
  • 安装教程
  • 其他教程
  • Python基础
  • 机器视觉
  • 基础
  • 虚拟化
  • OpenStack
  • 心情杂货
关于
收藏

周振林

IT界的小学生
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • Spring
  • SpringMVC
  • Mybatis
  • Docker
  • RabbitMQ
  • 安装教程
  • 其他教程
  • Python基础
  • 机器视觉
  • 基础
  • 虚拟化
  • OpenStack
  • 心情杂货
关于
收藏
  • Spring

  • SpringMVC

  • Mybatis

  • Docker

  • RabbitMQ

    • RabbitMQ安装
    • RabbitMQ控制台收发消息
    • RabbitMQ数据隔离
    • RabbitMQ入门Demo
    • RabbitMQ交换机类型
    • RabbitMQ注解方式声明队列和交换机
    • RabbitMQ消息转换器
      • 3.9.消息转换器
        • 3.9.1.测试默认转换器
        • 3.9.2.配置JSON转换器
        • 3.9.3.消费者接收Object
  • 设计模式

  • 安装教程

  • 其他教程

  • 后端
  • RabbitMQ
周振林
2026-04-01
目录

RabbitMQ消息转换器

# 3.9.消息转换器

Spring的消息发送代码接收的消息体是一个Object:

而在数据传输时,它会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。

只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:

  • 数据体积过大
  • 有安全漏洞
  • 可读性差

我们来测试一下。

# 3.9.1.测试默认转换器

1)创建测试队列 首先,我们在consumer服务中声明一个新的配置类:

利用@Bean的方式创建一个队列,具体代码:

@Configuration
public class MessageConfig {

    @Bean
    public Queue objectQueue() {
        return new Queue("object.queue");
    }
}
1
2
3
4
5
6
7
8

注意,这里我们先不要给这个队列添加消费者,我们要查看消息体的格式。

重启consumer服务以后,在控制台可以看到该队列就会被自动创建出来了

2)发送消息 我们在publisher模块的SpringAmqpTest中新增一个消息发送的代码,发送一个Map对象:

@Test
public void testSendMap() throws InterruptedException {
    // 准备消息
    Map<String,Object> msg = new HashMap<>();
    msg.put("name", "柳岩");
    msg.put("age", 21);
    // 发送消息
    rabbitTemplate.convertAndSend("object.queue", msg);
}
1
2
3
4
5
6
7
8
9

发送消息后查看控制台:

可以看到消息格式非常不友好。

# 3.9.2.配置JSON转换器

显然,JDK序列化方式并不合适。我们希望消息体的体积更小、可读性更高,因此可以使用JSON方式来做序列化和反序列化。

在publisher和consumer两个服务中都引入依赖:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</dependency>
1
2
3
4
5

注意,如果项目中引入了spring-boot-starter-web依赖,则无需再次引入Jackson依赖。

配置消息转换器,在publisher和consumer两个服务的启动类中添加一个Bean即可:

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

消息转换器中添加的messageId可以便于我们将来做幂等性判断。

此时,我们到MQ控制台删除object.queue中的旧的消息。然后再次执行刚才的消息发送的代码,到MQ的控制台查看消息结构:

# 3.9.3.消费者接收Object

我们在consumer服务中定义一个新的消费者,publisher是用Map发送,那么消费者也一定要用Map接收,格式如下:

@RabbitListener(queues = "object.queue")
public void listenSimpleQueueMessage(Map<String, Object> msg) throws InterruptedException {
    System.out.println("消费者接收到object.queue消息:【" + msg + "】");
}
1
2
3
4
Last Updated: 2026/04/01, 17:19:37
RabbitMQ注解方式声明队列和交换机
单例模式

← RabbitMQ注解方式声明队列和交换机 单例模式→

最近更新
01
RabbitMQ注解方式声明队列和交换机
04-01
02
RabbitMQ交换机类型
04-01
03
RabbitMQ入门Demo
04-01
更多文章>
Theme by Vdoing | Copyright © 2019-2026 鲁ICP备19032096号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×