springboot2.x +rabbitmq使用和源码分析三(消息转换器)

序言:

在第一篇和第二篇中,描述了自动装配的过程以及如何发送消息到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

Demo地址:https://github.com/fangyuan94/rabbitmq_demo.git 

上一篇: springboot2.x +rabbitmq使用和源码分析二(生产者配置)
下一篇: springboot2.x +rabbitmq使用和源码分析四(消费者-Listener使用)
F_Hello_World
博客等级 码龄11年 38粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值