SpringAMQP默认使用SimpleMessageConverter
组件对消息内容进行转换
- SimpleMessageConverter: only supports String, byte[] and Serializable payloads仅仅支持
String、Byte[]和Serializable对象
- Jackson2JsonMessageConverter:was expecting (
JSON String, Number, Array, Object or token 'null', 'true' or 'false'
)
SimpleMessageConverter
在使用默认的消息类型转换组件SimpleMessageConverter
的情况下发送一个Serializable Java对象给队列,那么队列中的消息内容如下图所示
可是这并不影响消费端在使用默认的消息类型转换组件SimpleMessageConverter
的情况下正确的接受该消息并进行成功的转换。
所以通常情况下,默认的消息类型转换组件SimpleMessageConverter
也是够用的。
Jackson2JsonMessageConverter
生产端配置Jackson2JsonMessageConverter
但有些时候,开发中 Java对象
往往都是以JSON的数据格式进行传输,此时只需要将默认的SimpleMessageConverter
消息转换器替换成Jackson2JsonMessageConverter
即可
在将消息类型转换器替换成Jackson2JsonMessageConverter
后,生产者把Java对象以JSON的数据格式成功发送到了指定的队列中,消息内容如下所示
当然消费端消费此消息的话,也需要和生产端保持同样的消息类型转化器。
消费端还是使用默认的
SimpleMessageConverter
来接受JSON格式的消息体会如何呢?经测试,无论参数类型是Message还是String都是没有问题的,可以正常接受
;但如果是一个Java对象来接受那么就会出现如下的异常信息
可以看出SimpleMessageConverter
直接JSON反序列化Java对象是不可行的;此时就必须使用Jackson2JsonMessageConverter
实例。
消费端配置Jackson2JsonMessageConverter
生产端可以通过
rabbitTemplate.setMessageConverter(messageConverter)
API来设置消息类型转换器。但通常情况下消费端只需要借助@RabbitListener
就可以完成对队列的监听,一个独立的消费端项目中可能根本就不需要显式的注入或配置rabbitTemplate
对象,因此setMessageConverter()这种方式来配置消息类型转换器也就无法使用。在源代码中寻找自动配置类是如何设置消息类型转换器。
下图所示,messageConverter
域决定最终使用哪个消息类型转换器,因此看看在什么时候是如何给该域赋值的?
下图所示,就是自动配置类配置消息类型转化器的方式
所以,只需要把Jackson2JsonMessageConverter
对象放到IOC容器中即可,这样自动配置类就会把默认的SimpleMessageConverter
给替换成Jackson2JsonMessageConverter
@Configuration
public class RabbitConfiguration {/*** 配置消息类型转化器* @return*/@Beanpublic Jackson2JsonMessageConverter jsonMessageConverter(){return new Jackson2JsonMessageConverter();}
}
可以看到消息类型转化器已设置成功
消费端借助Jackson2JsonMessageConverter组件成功反序列化Java对象