个人名片:
博主:酒徒ᝰ.
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:三人行,必有我师焉。
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看
三、SpringAMQP
6.消息转换器
在Spring AMQP中,消息转换器是一种重要的组件,用于处理消息的序列化和反序列化。Spring AMQP支持多种消息格式,如JSON、XML等,因此需要使用消息转换器将消息在生产者和消费者之间进行转换。
在Spring AMQP中,通常使用MessageConverter接口来实现消息转换器。Spring AMQP提供了几种默认的消息转换器,如StringMessageConverter、MappingJackson2MessageConverter、XmlMessageConverter等。
在Spring AMQP中使用消息转换器的作用:
- 实现消息的序列化和反序列化:在RabbitMQ中,生产者需要将对象转换成消息写入消息队列,消费者需要将消息转换回对象进行读取。因此,通过消息转换器,可以实现对象和消息之间的相互转换。
- 支持多种消息格式:Spring AMQP默认提供了多种消息转换器,如用于处理JSON格式的MappingJackson2MessageConverter,以及处理XML格式的XmlMessageConverter等。这意味着Spring
AMQP可以支持多种消息格式,从而满足不同的业务需求。- 提高代码的可维护性和可读性:使用消息转换器,可以将对象的序列化和反序列化逻辑从业务代码中分离出来,封装到一个单独的类中。这样做可以提高代码的可维护性和可读性,因为序列化和反序列化的逻辑被抽取到了一个专门的类中,便于后续的修改和维护。
- 简化开发过程:通过使用消息转换器,开发者可以不用关心底层的序列化和反序列化细节,只需要关注业务逻辑即可。这可以大大简化开发过程,提高开发效率。
因此,在Spring AMQP中使用消息转换器的主要作用是实现消息的序列化和反序列化,支持多种消息格式,提高代码的可维护性和可读性,以及简化开发过程。
测试发送Object类型消息
说明:在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化为字节后发送。
我们在consumer中利用@Bean声明一个队列:
@Bean
public Queue objectQueue(){
return new Queue("object.queue");
}
在publisher中发送消息以测试:
@Test
public void testObject() {
String queueName = "object.queue";
Map<String, Object> map = new HashMap<>();
map.put("name", "jack");
map.put("age", 2);
rabbitTemplate.convertAndSend(queueName, map);
}
消息转换器
Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的。而默认实现是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。
如果要修改只需要定义一个MessageConverter 类型的Bean即可。推荐用JSON方式序列化,步骤如下:
因为publisher和consumer都需要Json依赖,所有我们在父类服务引入依赖
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
我们在publisher服务声明MessageConverter:
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
我们在consumer服务定义MessageConverter:
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
然后定义一个消费者,监听object.queue队列并消费消息:
@RabbitListener(queues = "object.queue")
public void listenObjectQueue(Map<String, Object> message){
System.out.println("Object消息是" + message);
}
总结:
SpringAMQP中消息的序列化和反序列化是怎么实现的?
利用MessageConverter实现的,默认是JDK的序列化
注意发送方与接收方必须使用相同的MessageConverter