序言:
在第一篇和第二篇中,描述了自动装配的过程以及如何发送消息到mq。这里会涉及到将数据转化的工作,也就是如何将我们string或者java对象转化到二进制数据,传输到rabbitmq服务器中(在网络中只能传输二进制数据),而又是如何将到rabbitmq服务器传输的二进制数据转化为监听者需要的实体类型,这里就用到了消息转换器(也就是MessageConverter接口,在RabbitAnnotationDrivenConfiguration我们可以看到有该类的定义并将该类与监听工厂类绑定,在RabbitTemplateConfigurer中与RabbitTemplate绑定,说明我们在发送与接受时都需要该类使用)
1:MessageConverter
该接口为消息转化接口
ublic interface MessageConverter {
/**
* 将一个java 对象转化为message
* @param object 被转化的对象
* @param messageProperties message属性信息
* @return the Message 转化的Message
* @throws MessageConversionException 转化失败抛出的异常
*/
Message toMessage(Object object, MessageProperties messageProperties) throws MessageConversionException;
/**
* 上述toMessage的重载方法 本质还是调用toMessage
* @param object 被转化的对象
* @param messageProperties message属性信息
* @param genericType the type to use to populate type headers.
* @return the Message 转化的Message
* @throws MessageConversionException 转化失败抛出的异常
* @since 2.1
*/
default Message toMessage(Object object, MessageProperties messageProperties, @Nullable Type genericType)
throws MessageConversionException {
return toMessage(object, messageProperties);
}
/**
* 将一个Message转化为java对象
* @param message 被转化的Message
* @return 转化的Java对象
* @throws MessageConversionException in case of conversion failure
*/
Object fromMessage(Message message) throws MessageConversionException;
}
对于上述该接口,spring为我们提供了不同的实现,应对不同需求。详细的源码在org.springframework.amqp.support.converter(包下),如下图所示:

2:SimpleMessageConverter(默认消息转换器)
spring提供的默认的rabbitmq消息转换器,它提供对byte数组,String,实现了Serializable的java对象进行消息转化。
以下为:SerializerMessageConverter转化之后在rabbitmq中的结构
java对象:
string:

3:SerializerMessageConverter
从转换器的名称可以看出该转换器针对于实现了Serializable的java对象(包括string字符串),实际上SimpleMessageConverter与SerializerMessageConverter的功能相似
以下为:SerializerMessageConverter转化之后在rabbitmq中的结构。
java对象:

string:

4:Jackson2JsonMessageConverter
使用jackson2 的json库的JSON转换器
以下为:Jackson2JsonMessageConverter转化之后在rabbitmq中的结构。
java对象:

sting:
可以看到与上述的消息转化器不同,Jackson2JsonMessageConverter将数据转换为json进行存储。Jackson2JsonMessageConverter其实在实际也用,用的较少,第一:同一对象转化存储到rabbitmq服务中byte字节较大,第二转化时间较长,唯一有点消息可读性强,其它两序列化器也可以通过先json字符串后再保存的方式达到
5:Jackson2XmlMessageConverter
使用jackson2的xml库的XML转换器,与Jackson2JsonMessageConverter功能一直,不同在于该转换器处理xml
6:对比以上这几种转换器效率
这几种转换器的效率(因为Jackson2XmlMessageConverter针对于xml,所以一般用的较少。所以这里比较的是2,3,5这三种),
测试两者效率代码:
public class MessageConverterTest {
public static void main(String[] args) {
// jackson2JsonMessageConverterTest();
// simpleMessageConverterTest();
serializerMessageConverterTest();
}
private static void serializerMessageConverterTest() {
long startTime = System.currentTimeMillis();
for (int i=0;i<1000;i++){
CorrelationData correlationData = new CorrelationData();
correlationData.setId("1"+i);
correlationData.setMessage("测试数据direct1"+i);
correlationData.setExchange(CommonConstant.exchange_direct);
correlationData.setRoutingKey(CommonConstant.routingKey_direct1);
correlationData.setRetryCount(i);
SerializerMessageConverter serializerMessageConverter = new SerializerMessageConverter();
Message message = serializerMessageConverter.toMessage(correlationData,null );
Object o = serializerMessageConverter.fromMessage(message);
// System.out.println(o);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
private static void simpleMessageConverterTest() {
long startTime = System.currentTimeMillis();
for (int i=0;i<1000;i++){
CorrelationData correlationData = new CorrelationData();
correlationData.setId("1"+i);
correlationData.setMessage("测试数据direct1"+i);
correlationData.setExchange(CommonConstant.exchange_direct);
correlationData.setRoutingKey(CommonConstant.routingKey_direct1);
correlationData.setRetryCount(i);
SimpleMessageConverter simpleMessageConverter = new SimpleMessageConverter();
Message message = simpleMessageConverter.toMessage(correlationData,null );
Object o = simpleMessageConverter.fromMessage(message);
// System.out.println(o);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
public static void jackson2JsonMessageConverterTest(){
long startTime = System.currentTimeMillis();
for (int i=0;i<1000;i++){
CorrelationData correlationData = new CorrelationData();
correlationData.setId("1"+i);
correlationData.setMessage("测试数据direct1"+i);
correlationData.setExchange(CommonConstant.exchange_direct);
correlationData.setRoutingKey(CommonConstant.routingKey_direct1);
correlationData.setRetryCount(i);
Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
Message message = jackson2JsonMessageConverter.toMessage(correlationData,null );
Object o = jackson2JsonMessageConverter.fromMessage(message);
// System.out.println(o);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
}
最终得到3种转换器转换时间:
SerializerMessageConverter微小于<SimpleMessageConverter<Jackson2JsonMessageConverter
978



被折叠的 条评论
为什么被折叠?



