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 

“华为杯”研究生数学建模竞赛2020年-【华为杯】E题:能见度估计与预测(附获奖论文及python代码实现) 因此,题目要求借助机场的 AMOS 观测数据中的气压、温度、湿度、风速等气象因子,达到 100% 时,空气中的水汽便会凝结成细微的水滴悬浮于空中,使地面水平的能见度下。传统的仪器探测法成本高,覆盖范围小,而基于视频的能见度检测能弥补仪器测量的不足之处,但是预测精度不高,需要进一步改。象条件,空气质量的影响,其中较为关键的影响因子是雾和霾。性过强,激光能见度仪的检测方法更为可信,但是激光能见度仪覆盖的检测范围小,安装。覆盖的交通视频路况数据间接计算得到能见度数值的方法,此方法成本较低,覆盖范围广。 阅读详情

相关推荐

杭电oj2023题题目详解(Java版)

杭电oj2023题详解

m0_51065958的博客 978

Spring整合Jms学习(三)_MessageConverter介绍

1.4     消息转换器MessageConverter MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Message对象,这主要是用在发送消息的时候;另一方面它又可以把我们的Message对象转换成对应的目标对象,这主要是用在接收消息的时候。 下面我们就拿发送一个对象消息来举例,假设我们有这样一个需求:我们平台有一个发送邮

yuanlaishini2010的专栏 1281

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7275

RabbitMQ学习笔记(四)消息转换器

这一转换操作由org.springframework.amqp.support.converter.MessageConverter来处理,默认实现是SimpleMessageConverter,是基于JDK的ObjectOutputStream完成序列化。第二部:在生产者和消费者中配置MessageConverter(我配置在启动主类下)JDK序列化存在安全风险、JDK序列化后消息太大、可读性差。第一步:引入json依赖(fastjson或是jackson)化来代替JDK序列化。

zz690408的博客 481

BUPT软件安全实验三

可以看出栈溢出对程序运行的安全性有很大的威胁,如果不对栈进行保护,只要系统中存在栈溢出漏洞,即可令攻击者通过非正当方法获取操作权限。(6)解决思考题,即:在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。查看缓冲区信息,可以看到dest指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。

7xun's space 1966

ensp VRRP+MSTP综合性实验

网络结构拓扑图 实验要求 要求: 1、全网互通,IP地址任意规划,路径最优,无环路。 2、AR1上面有一个loopback口,ip地址为1.1.1.1/24, 要求所有电脑能访问。 3、vlan10通过LSW1访问1.1.1.1,当LSW1出现问题即使 g0/0/1故障亦能通过lsw2访问。 vlan30通过LSW2访问1.1.1.1,当LSW2出现问题即使 g0/0/1故障亦能通过lsw1访问。 4、LSW1为vlan10的主根,vlan30的备根。 LSW2为vlan30的主根,vlan1

qq_45631844的博客 1万+

Springboot RabbitMq源码解析之消息发送

Springboot RabbitMq源码解析之配置类 1. RabbitTemplate#convertAndSend rabbitmq的发送可以通过AmqpTemplate接口实现,AmqpTemplate接口下重载了许多send和convertAndSend方法。send用于发送Message格式的数据,convertAndSend方法先将对象转化成Message数据后进行发送。 从前面的配...

翻身已碰头的博客 5520

【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)

完整笔记:http://www.gwylab.com/note-vae.html 李宏毅老师的教程视频:https://www.bilibili.com/video/av15889450/?p=33 —————————————————————————————————   依据李宏毅老师的讲解,我整理了一番VAE的笔记。先简单介绍一下VAE,VAE作为一个生成模型,其基本思路是很容易理解的:把一堆真...

a312863063的博客 14万+

RabbitMQ报错 SimpleMessageConverter only supports String, byte[] and Serializable payloads

1.RabbitMQ报错 SimpleMessageConverter only supports String, byte[] and Serializable payloads RabbitMQ报错java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[] and Serializable payloads, received: com.zhangsan.producer.pojo.Ne

薛之谦 8931

SPL06气压温度传感器SPI驱动与补偿算法详解

气压传感器与温度传感器是嵌入式环境感知系统的核心组件,其测量精度高度依赖于MEMS芯片的校准参数与非线性补偿机制。SPL06作为集成式高精度数字传感器,采用24位Σ-Δ ADC与片内补偿引擎,需结合唯一出厂校准系数(即‘芯片指纹’)进行多阶数学修正,才能将原始ADC值转化为符合计量要求的帕斯卡(Pa)与摄氏度(℃)物理量。该过程涵盖SPI通信协议解析、寄存器时序控制、大端数据拼接、二进制补码处理及浮点/定点混合运算等典型嵌入式工程实践。广泛应用于无人机高度计、智能穿戴海拔监测与IoT气象终端中。

weixin_34640289的博客 143

从零开始:使用Verilog在FPGA上实现8051微控制器的完整指南

8051微控制器是一种8位微控制器,由Intel在1980年代初推出。它包括一个CPU、一些RAM和ROM、I/O端口、定时器和串行通信接口。由于其简单的架构和强大的功能,8051已经成为了嵌入式系统设计的首选。FPGA是一种集成电路,设计师可以按照自己的需求进行编程。与传统的ASIC(应用特定集成电路)相比,FPGA提供了更高的灵活性,允许在硬件级别进行快速原型设计和迭代。这里,我们定义了一些基本的输入/输出端口,如时钟clk、复位reset、数据输入/输出和地址输入/输出。

qq_38334677的博客 1332

RabbitMq消息监听,转换问题

在发送消息的时候,我们可以通过代码看到RabbitMq默认的是使用SimpleMessageConverter来进行消息转换的   SimpleMessageConverter的源码如下图   源码分析总结: 1.MessageConverter可以把java对象转换成Message对象,也可以把Message对象转换成java对象 2.MessageListenerAdapter内部...

g3230863的博客 5961

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device, Quartus的安装过程不同于ISE/vivado的安装。“Current license file does not support”这种情况多出现在高版本的quartus中综合很久以前的代码,使用很早型号的FPGA或是CPLD。对于这种情况,就得在官网或是其他网站上下载包含所需Device的库文件。

夜半少年的博客 1万+

springboot 2.x整合rabbitmq

一、引入pom.xml &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-amqp&lt;/artifactId&gt; &lt;/dependency&gt; 二、在application.yml或a...

adminit的博客 505

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RabbitMQ基础篇(同步通讯和异步通讯、异步调用的角色组成、异步调用的优点和缺点、消息队列技术选型、安装RabbitMQ、数据隔离、在SpringBoot项目中集成RabbitMQ、交换机)

RabbitMQ基础篇(同步通讯和异步通讯、异步调用的角色组成、异步调用的优点和缺点、消息队列技术选型、安装RabbitMQ、数据隔离、在SpringBoot项目中集成RabbitMQ、交换机)

聂可以的博客 8112

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

三、SpringBoot整合RabbitMQ

一、SpringBoot整合RabbitMQ 1、环境准备 1、由于在上一篇中的创建项目是SpringBoot的,直接修改RabbitMQ依赖即可,删除掉之前使用的RabbitMQ依赖 <!--RabbitMQ依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifac

余笙的博客 3349

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

rabbitmq详解

整理rabbitmq下载安装、rabbitmq界面、rabbitmq五种模型、rabbitmq并发消费、rabbitmq批量发送,rabbitmq批量消费,rabbitmq延迟队列,ttl队列,死信队列,消息确认,集群搭建等

qq_48721706的博客 3万+

基于SpringBoot2.X 整合 RabbitMQ 简单使用

加依赖先 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.amqp</groupId>

weixin_42633481的博客 282

SpringBoot整合RabbitMQ

导入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.2</version> </dependenc...

zifan_的博客 227

SpringBoot整合使用RabbitMq

  Spring已经集成了RabbitMq,所以在SpringBoot整合上也是很简单,只要导入相应的启动器,并进行配置 1. 导入启动器 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2. 配置RabbitMq   RabbitMq的相

华小灼 601

SpringBoot集成rabbitmq使用教程

本文介绍了RabbitMQ在Spring Boot中的配置与应用。主要包括:1)添加依赖和配置RabbitMQ连接参数;2)核心概念如生产者、消费者、队列和交换机等;3)实际应用场景的实现,包括死信队列(配置死信交换机、队列和绑定规则)和延时队列(通过插件或死信队列实现)。详细说明了不同延时方案的实现方法,如固定延迟、动态延迟和多延时队列方案,并列举了订单超时、预约提醒等经典应用场景。最后建议根据业务需求选择合适的延时方案。

2301_80255646的博客 555

SpringBoot 整合 RabbitMQ:和这只“兔子”交朋友

RabbitMQ 就像是一个**超级邮差兔**,不过它不送胡萝卜,专门传递消息!交换机(Exchange),队列(Queue),路由键(Routing Key),消息(Message)。

悟空码字的博客 1135

SpringBoot 整合 RabbitMQ(快速入门)

Linux centOS7 安装rabbitmq的步骤 1.uname -r检查系统内核版本 2.yum install docker下载docker 3.systemctl start docker 开启运行docker 4.docker -v查看docker版本 5.systemctl enable docker设置docker开机启动 6.docker pull ...

我是小妖怪,潇洒又自在 825

springboot配置rabbitmq的序列化反序列化格式

SpringBoot封装了rabbitmq中,发送对象和接收对象时,会统一将对象和消息互相转换 会用到MessageConverter转换接口 在发送消息时, 会将Object转换成Message Message createMessage(Object object, MessageProperties messageProperties) 接收消息时 SimpleMessageListene...

zhanboring的博客 371

06-RabbitMQ之SpringBoot使用

由于SpringBoot官方支持RabbitMQ,所以RabbitMQ与SpringBoot的集成是非常简单的。不过SpringBoot集成RabbitMQ的方式是按照Spring的一套统一的MQ模型创建的,因此SpringBoot集成插件中对于生产者、消息、消费者等重要的对象模型,与RabbitMQ原生的各个组件有对应关系,但是并不完全相同。...

qq_39234967的博客 410

SpringBoot 使用RabbitMQ 做延时队列

SpringBoot 使用RabbitMQ 做延时队列 一、前言 延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单;2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度;3.过1分钟给新注册会员的用户,发送注册邮件等。 实现延迟队列的方式有两种: 通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能; 使用rabbitmq-delayed-message-...

qq_43582593的博客 317
上一篇: 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、付费专栏及课程。

余额充值