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

结果,非常简洁。

相关推荐
程序员烧烤4 分钟前
【Java基础14】函数式接口、lamba表达式、方法引用一网打尽(下)
java·开发语言
spencer_tseng13 分钟前
pinyin4j-2.5.0.jar
java·jar·pinyin4j
ZhengEnCi24 分钟前
J1B-为什么99%的人配置Java环境失败?大厂开发者5分钟搞定的JDK安装与环境配置完全指南
java
零雲28 分钟前
java面试:有了解过kafka架构吗,可以详细讲一讲吗
java·面试·kafka
一行•坚书33 分钟前
kafka服务端与客户端如何协作?生产者发送消息分区策略是什么?消费者组分区策略?集群与ACK机制?
java·后端·kafka
serve the people1 小时前
Prompt Composition with LangChain’s PipelinePromptTemplate
java·langchain·prompt
天天摸鱼的java工程师1 小时前
干掉系统卡顿!Excel异步导出完整实战方案(百万数据也不慌)
java·后端
心随雨下1 小时前
Java中将System.out内容写入Tomcat日志
java·开发语言·tomcat
-指短琴长-2 小时前
ProtoBuf速成【基于C++讲解】
android·java·c++
Cx330❀2 小时前
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用
java·开发语言·数据结构·c++·算法·面试