一、消息转换器
消息转换器是一个用于将消息转换为特定格式或类型的组件。在分布式系统中,消息转换器通常用于在不同的系统或服务之间进行数据传输和交互。
在Spring框架中,当消息发送者将消息发送到RabbitMQ时,如果消息体被封装为一个Object,在数据传输过程中,这个Object会被序列化为字节流,然后发送给RabbitMQ。同样,当消息接收者从RabbitMQ接收消息时,字节流会被反序列化为Java对象。
然而,默认情况下,Spring使用的是Java的序列化方式(JDK序列化)来进行这种转换。JDK序列化虽然简单易用,但也存在一些问题:
- 数据体积过大:JDK序列化生成的数据体积相对较大,这可能会影响传输效率和存储效率。
- 有安全漏洞:JDK序列化可能存在一些安全漏洞,例如,攻击者可能通过序列化恶意对象来执行任意代码。
- 可读性差:JDK序列化生成的字节流难以阅读和理解,这给调试和审计带来了困难。
为了解决这些问题,可以使用其他的序列化方式,例如JSON序列化等。
二、RabbitMQ默认转换器案例(省略交换机)
在consumer服务中声明队列:
@Bean public Queue objectQueue() { return new Queue("object.queue"); }
在publisher服务中编写测试类,实现消息发送:
@Test void testSendObject() { Map<String, Object> msg = new HashMap<>(2); msg.put("username", "user"); msg.put("password", 123456); rabbitTemplate.convertAndSend("object.queue", msg); }
运行后在RabbitMQ管理控制台查看消息:
三、JSON转换器案例(省略交换机)
1.配置JSON转换器
在publisher和consumer两个服务(父工程)中引入Jackson依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
配置消息转换器(在publisher和consumer两个服务的启动类中添加一个Bean):
@Bean public MessageConverter jacksonMessageConvertor(){ return new Jackson2JsonMessageConverter(); }
2.运行结果
重启项目,运行测试类,并在RabbitMQ管理控制台查看消息:
在consumer服务中新建一个类实现消息接收 :
@RabbitListener(queues = "object.queue") public void listenObject(Map<String, Object> msg) throws InterruptedException { System.out.println("object.queue:" + msg); }
重启项目查看结果:
总结
RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了RabbitMQ默认转换器、JSON转换器及其案例等内容,希望对大家有所帮助。