一、消息转换器
Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。
只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:
-
数据体积过大
-
有安全漏洞
-
可读性差
JDK序列化方式并不合适。我们希望消息体的体积更小、可读性更高,因此可以使用JSON方式来做序列化和反序列化。
二、实现JSON消息转换器
spring 的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的.而默认实现是SimpleMeaasgeConverter,基于JDK的ObjectOutputStream完成序列化。
如果要修改只需要定义一个MessageConverter类型的Bean即可.推荐使用JSON方式序列化,步骤如下:
步骤一:
我们在publisher服务和consumer服务的父工程引入依赖:
XML
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
步骤二:
我们在publisher服务声明MessageConverter:
java
@Bean
public MessageConverter essageConverter(){
return new Jackson2JsonMessageConverter();
}
步骤三:
我们在consumer服务定义MessageConverter
java
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
步骤四:
定义生产者,向object.queue队列发送消息
java
@Test
public void testSendObjectQueue() {
Map<String, Object> msg = new HashMap<>();
map.put("name","张三");
map.put("age",21);
// 发送消息
rabbitTemplate.convertAndSend( "object.queue", msg);
}
步骤五:
然后定义一个消费者,监听object.queue队列并消费信息:
java
@RabbitListener(queues = "object.queue")
public void listenObjectQueue(Map<String,Object> msg){
System.out.println("接收到object.queue的消息:" + msg);
}
注意:发送方与接收方必须使用相同的MessageConverter。
完成测试:
发送消息后查看控制台:
数据格式为:content_type:application/json