RabbitMQ消息转换器

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

只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:数据体积过大,有安全漏洞,可读性差。

比如当我们发送一个复杂结构对象时:

java 复制代码
@Test
public void testSendMap() throws InterruptedException {
    // 准备消息
    Map<String,Object> msg = new HashMap<>();
    msg.put("name", "张三");
    msg.put("age", 18);
    // 发送消息
    rabbitTemplate.convertAndSend("object.queue", msg);
}

mq接受的消息则是这样的:

堪比三年模拟五年高考,又臭又长。

使用我们这里可以使用一个JSON转换器。可以使消息体的体积更小、可读性更高。

首先,在publisherconsumer两个服务中都引入依赖:

java 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</dependency>

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

配置消息转换器,在publisherconsumer两个服务的启动类中添加一个Bean:

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

再次测试:

java 复制代码
@Test
public void testSendMap() throws InterruptedException {
    // 准备消息
    Map<String,Object> msg = new HashMap<>();
    msg.put("name", "柳岩");
    msg.put("age", 21);
    // 发送消息
    rabbitTemplate.convertAndSend("object.queue", msg);
}

结果,非常简洁。

相关推荐
luckywuxn13 分钟前
EurekaServer 工作原理
java·eureka
壹米饭16 分钟前
Java程序员学Python学习笔记一:学习python的动机与思考
java·后端·python
java金融18 分钟前
Java 锁升级机制详解
java
Young556621 分钟前
还不了解工作流吗(基础篇)?
java·workflow·工作流引擎
让我上个超影吧23 分钟前
黑马点评【缓存】
java·redis·缓存
ajassi200031 分钟前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
YuTaoShao1 小时前
Java八股文——MySQL「存储引擎篇」
java·开发语言·mysql
crud1 小时前
Java 中的 synchronized 与 Lock:深度对比、使用场景及高级用法
java
王德博客1 小时前
【Java课堂笔记】Java 入门基础语法与面向对象三大特性详解
java·开发语言
seventeennnnn1 小时前
Java大厂面试真题:谢飞机的技术挑战
java·spring boot·面试·aigc·技术挑战·电商场景·内容社区