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

从《视觉SLAM十四讲》到项目实战:一文读懂拓扑地图与语义地图为何是服务机器人的未来 本文探讨了服务机器人地图技术的演进,从传统几何地图到拓扑地图与语义地图的跨越。通过分析栅格地图的局限性和拓扑地图、语义地图的优势,揭示了它们在动态开放环境中的智能应用。文章还介绍了多模态语义融合架构和动态语义更新技术,为服务机器人的未来发展提供了技术路线图。 阅读详情

序言:

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

手把手教你学Simulink——基于Simulink的储能PCS(功率转换系统)离网V/f控制仿真示例 本文带你从零开始,在Simulink中硬核还原了一套完整的100kW 储能PCS离网V/f控制系统。通过引入:✅无PLL的自主角度生成机制(实现真正的“构网”能力)✅电压外环与电流内环的双闭环解耦架构(兼顾稳态精度与动态响应)✅黑启动软充电与有源阻尼等工程化手段(确保系统平滑建压与抗谐振)核心收获透彻理解了储能系统在无大电网支撑下的自主运行机理。掌握了从“跟网(Grid-Following)”向“构网(Grid-Forming)”跨越的控制算法核心差异。 阅读详情

相关推荐

Python爬取网页数据并写入Excel

ChromeDriver下载链接:https://registry.npmmirror.com/binary.html?path=chromedriver/本例是从Excel表从读取数据,运用到网页中进行搜索,再将结果写入Excel表中。这里要先下载与Chrome版本相同的chromedriver(版本要相同!下载好后,将chromedriver路径正确配置在环境变量中。刚才爬了一些数据,分享一下代码。

weixin_68443051的博客 2519

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

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

yuanlaishini2010的专栏 1281

编译opencv4.2时出现undefined reference to `jpeg_default_qtables‘错误的解决方案

操作系统:kylinV10 opencv版本:4.2.0 在编译opencv4.2.0的版本时,出现undefined reference to `jpeg_default_qtables’的错误提示,导致openc编译中断,不能继续编译,所以这个错误必须解决。 解决方案 查看错误的名字,根据名字分析,很有可能是当前系统中没有安装jpeg第三方库,到 http://www.ijg.org/上下载最新的源码包 jpegsrc.v9e.tar.gz,按如下顺序开始编译安装: tar -xzvf jpegsr.

jndingxin的专栏 5106

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

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

zz690408的博客 481

【心得】Back trader避坑指南(一)——关于安装过程的问题

我认为一开始比较容易卡住的地方,主要是安装上面的问题。我给大家整理的这个版本是我能跑通的版本,还有一些好用的神器,手把手教你怎么装!

weixin_38347757的博客 1303

微信PC端Multi文件夹数据库解析:语音消息导出与转换实战指南

本文提供了一份详细的微信PC端语音消息导出与转换实战指南。通过解析Multi文件夹中的MediaMSG数据库,指导用户定位、解密数据库,并利用Python脚本精准提取SILK格式语音,最终转换为通用的WAV或MP3格式,实现个人语音数据的本地备份与处理。

garlic的博客 583

Springboot RabbitMq源码解析之消息发送

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

翻身已碰头的博客 5520

数理统计四大分布---正态分布、卡方分布、学生t分布和F分布

在统计学上,我们会遇到一些常见的分布,除了正态分布外,,如t检验对应的t分布,检验对应的分布,方差分析对应的F分布等。这些分布是统计学的基础,在假设检验、方差分析等领域都起着至关重要的作用。在此,我们对这四种分布做详细的介绍,并附上MATLAB代码。 四种分布的讲解摘自MATLAB 2016的统计学和机器学习工具箱,有兴趣的可以去查看英文原版。 另外,为了方便,上传文档为图片格式,可能有些模糊...

suncangan的博客 5万+

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

ORB-SLAM3在windows11下的编译使用

近期在学习SLAM,想部署一下ORB-SLAM3,但是自己电脑是win11系统,因此就想着在win11上部署一下。但是网上看了一些教程,有一些博客,但是可能不适合我这种情况把,就很纠结。先说下结果,配置成功,过程极其痛苦。

weixin_44457768的博客 6096

深度学习-155-RAG技术之嵌入模型Embedding怎么选

Embedding技术在大型语言模型中发挥着至关重要的作用。它将文本转化为向量,使模型能够理解和处理复杂的语言信息。通过选择合适的Embedding方法和优化文本匹配策略,我们可以在搜索引擎、问答系统、推荐系统等领域实现高效且精准的文本匹配。

qq_20466211的博客 405

RabbitMq消息监听,转换问题

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

g3230863的博客 5961

辉芒微教程第七篇《PWM与PWM3调节LED灯的亮度》

这个其实就是PR3L = 128设置的,由于我们刚刚寄存器设置了8位模式,其设置的范围就是0-255,而128/255≈50%左右,因此PR3L就是我们的占空比调节的寄存器,我们可以通过它来调节占空比,大家可以试试它占空比设置10%,30%,60%来看看它的不同效果,灯的亮度是肯定不一样的,如果有条件的朋友,可以购买一款逻辑分析仪去看他的占空比。平平无期的这个东西有什么东东用,貌似是没什么用,只是一个概念而已,是不是不同设备可以设置1秒,3秒,10秒的周期就行?但是它占空比为什么是50%,怎么得来的?

qq_41809823的博客 827

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

聂可以的博客 8112

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

三、SpringBoot整合RabbitMQ

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

余笙的博客 3349

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

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

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、付费专栏及课程。

余额充值