说明:使用SpringAMQP中的RabbitMQ,发送的消息如果是对象的话,会被Spring序列化进行传输,序列化后的java对象,内容会变得很长,导致本来只有十几个字节的对象数据变成几百字节。这个问题可以通过自定义的消息转化器替换掉Spring默认的消息转换器,使消息以json数据的形式传输,不进行序列化。
默认的消息转化器
测试一下默认的消息转化器,看下效果
@Test
public void sendMapMsg() {
// 准备对象数据
Map<String,Object> msgMap = new HashMap<>();
msgMap.put("name", "zhangsan");
msgMap.put("age", 25);
// 发送消息
rabbitTemplate.convertAndSend("msgMap.queue", msgMap);
}
打开RabbitMQ管理平台,可以看到就这两行信息,被序列化后足有183byte;
自定义消息转化器
使用自定义消息转化器,需要导入下面的依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.10</version>
</dependency>
将自定义的JSON消息转化器,手动添加到IOC容器中
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
添加完成后,再次发送消息,查看RabbitMQ管理平台的消息,可以看到json格式的消息要小得多
同样,接收方需要对消息的转换需要和发送方一致,如果发送方将消息转为成了json,接收方想正常接收,也需要使用自定义的JSON消息转化器
@RabbitListener(queues = "msgMap.queue")
public void listenMapQueueMessage(Map<String,Object> map){
System.out.println("map = " + map);
}
不然会报消息转换异常
Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [java.util.Map] for GenericMessage [payload=byte[28],