rabbitMQ消息转换器

devtools/2025/2/7 10:02:25/

消息转换器

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

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

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

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

我们来测试一下。

测试默认转换器

创建测试队列

我们在consumer服务中声明一个配置类,MessageConfig,里面编写方法创建队列。

java">@Configuration
public class MessageConfig {@Beanpublic Queue objectQueue(){return new Queue("object.queue");}
}

重启consumer服务,看看rabbit控制台。

发送map消息

在consumer服务中,新增ObjectQueueTest类,发送消息。

java">@SpringBootTest
public class ObjectQueueTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSendObjectQueue(){// 1 队列String queueName = "object.queue";// 2 消息Map<String,Object> map = new HashMap<>();map.put("name","sde");map.put("age",18);// 3 发送消息rabbitTemplate.convertAndSend(queueName,map);}
}

看看控制台是否有消息

查看消息

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

配置JSON转换器

添加依赖

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

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

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

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

配置消息转换器

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

在PublisherApplication启动类中添加

java">@SpringBootApplication
public class PublisherApplication {public static void main(String[] args) {SpringApplication.run(PublisherApplication.class);}@Beanpublic MessageConverter messageConverter(){// 1 定义消息转换器Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();//2、配置每条消息自动创建id;用于识别不同消息,也可以在页面中基于id判断是否是重复消息jjmc.setCreateMessageIds(true);return jjmc;}}

在ConsumerApplication 启动类添加如下

java">@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}@Beanpublic MessageConverter messageConverter(){// 1 定义消息转换器Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();//2、配置每条消息自动创建id;用于识别不同消息,也可以在页面中基于id判断是否是重复消息jjmc.setCreateMessageIds(true);return jjmc;}}

测试

① 在rabbitMQ的控制台中删除 object.queue 队列中的消息;重新启动 consumer

② 执行 com.sde.publisher.ObjectQueueTest类里面的方法,发送消息。

③ 在rabbitMQ的控制台中;查看消息

删除队列里面的消息

重启了 consumer服务

再次发送了一条消息

控制台查看消息

消费者接收Object

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

新创建 ObjectQueueListener 类,编写代码接收消息。

java">@Slf4j
@Component
public class ObjectQueueListener {/*** 监听 object.queue 队列中的消息。*/@RabbitListener(queues = "object.queue")public void listenObjectQueue(Map<String,Object> map){System.out.println("【消费者】监听到 object.queue 队列的消息:"+map);}
}

控制台


http://www.ppmy.cn/devtools/156774.html

相关文章

【自学笔记】Agent的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Agent的定义Agent的构成要素Agent的工作原理Agent的性能评估Agent的应用场景Agent的优势Agent与Workflow的区别与联系 总结 以下是以MD格式罗列的关于Agent的知识点…

《ISO/SAE 21434-2021 道路汽车--网络安全工程》标准解读

1 范围 略 2 归一化引用 略 3 术语定义 相关项&#xff1a; 实施车辆级功能的组件或组件集; 例如 安全气囊打开系统 组件&#xff1a; 逻辑上和技术上可分离的部分&#xff1b;例如 微控制器 资产&#xff1a; 具有价值或对价值有贡献的对象&#xff1b;例如 密钥 网络安全…

vue3-响应式 toRefs

在Vue 3中&#xff0c;toRefs是一个非常有用的组合式API&#xff08;Composition API&#xff09;函数&#xff0c;它主要用于将响应式对象&#xff08;通常是由reactive创建的对象&#xff09;转换为单独的响应式引用对象。这样做的好处是可以将这些响应式引用解构出来&#x…

docker 实战练习1

安装部署docker 和docker-compose #卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine#安装依赖包 yum install -y yum-utils device-mapper-persistent-da…

【C++】多态详细讲解

本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态&#xff1a;主要就是我们前⾯讲的函数重载和函数模板&#xff0c;他们传不同类型的参数就可以调⽤不同的函数&#xff0c;通…

w192中国陕西民俗网的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

求解大规模单仓库多旅行商问题(LS-SDMTSP)的成长优化算法(Growth Optimizer,GO),MATLAB代码

一、问题定义 大规模单仓库多旅行商问题&#xff08;Large-Scale Single-Depot Multi-Traveling Salesman Problem&#xff0c;简称 LS-SDMTSP&#xff09;是组合优化领域中极具挑战性的经典问题。假设存在一个单一仓库&#xff0c;它既是所有旅行商的出发地&#xff0c;也是最…

kamailio-ACC、ACC_JSON 和 ACC_RADIUS 的区别

ACC、ACC_JSON 和 ACC_RADIUS 的区别 ACC、ACC_JSON 和 ACC_RADIUS 都是 Kamailio 中用于计费&#xff08;Accounting&#xff09;的模块&#xff0c;但它们的功能和后端支持有所不同。以下是它们的区别及案例说明&#xff1a; 1. ACC 模块 功能&#xff1a;ACC 模块是 Kamai…