SpringAMQP - 消息传输时,如何提高性能?解决 SQL 注入问题?

news/2024/4/29 19:46:47/文章来源:https://blog.csdn.net/CYK_byte/article/details/131721983

目录

一、问题背景

二、从消息转化器根源解决问题

1.引入依赖

2.在服务生产者和消费者中都重新定义一个 MessageConverter,注入到 Spring 容器中


一、问题背景


SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,接下来做个小实验

如下,注入一个队列到容器中,接着在提供一个服务生产者供测试,发送一个对象数据,观察 RabbitMQ 客户端队列数据形式

@Configuration
public class FanoutConfig {@Beanpublic Queue objectQueue() {return new Queue("object.queue");}}
    @Testpublic void testObjectMessage() {HashMap<String, Object> map = new HashMap<>();map.put("国家", "china");rabbitTemplate.convertAndSend("object.queue", map);}

 运行后,查看 RabbitMQ 队列数据如下:

为什么发送的消息变成了这个样子呢?

这是因为SpringAMQP会帮我们序列化为字节后发送:Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter 来处理的。而默认实现是SimpleMessageConverter,基于JDKObjectOutputStream完成序列化。 

但是这样的数据就有可能引发以下两种问题:

  1. 转化后数据过长,影响传输效率。
  2. 容易引发 sql 注入问题。

二、从消息转化器根源解决问题


我们只需要在服务生产者和消费者的 Spring 启动类中都重新定义一个 MessageConverter 类型的Bean即可。这里推荐用JSON方式序列化~

具体步骤如下:

1.引入依赖

因为服务生产者和服务消费者都需要 JSON 来序列化和反序列化,因此直接在的父类中引入依赖即可

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

2.在服务生产者和消费者中都重新定义一个 MessageConverter,注入到 Spring 容器中

使用 @Bean 注解注入即可

@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}@Beanpublic MessageConverter jsonMessageConverter() {return new Jackson2JsonMessageConverter();}}
@SpringBootApplication
public class PublisherApplication {public static void main(String[] args) {SpringApplication.run(PublisherApplication.class);}@Beanpublic MessageConverter jsonMessageConverter() {return new Jackson2JsonMessageConverter();}}

再尝试发送数据,结果如下:

Ps:注意发送方与接收方必须使用相同的MessageConverter

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_331253.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 GPU 并行环境 Isaac Gym + 强化学习库 ElegantRL:训练机器人Ant,3小时6000分,最高12000分

前排提醒,目前我们能 “用 ppo 四分钟训练 ant 到 6000 分”,比本文的 3 小时快了很多很多,有空会更新代码 https://blog.csdn.net/sinat_39620217/article/details/131724602 介绍了 Isaac Gym 库 如何使用 GPU 做大规模并行仿真,对环境模块提速。这篇帖子,我们使用 1 …

class文件反编译成Java文件

下载jad158g.win压缩包解压到指定的磁盘下&#xff08;下载目录&#xff1a;https://varaneckas.com/jad/&#xff09; 操作命令&#xff1a;jad -o -r -s java -d src classes/**/*.class 此处src为生成Java文件存放的文件夹&#xff0c;classes则为需要转化成Java的class文件…

docker 里面各种 command not found 总结

一、ip&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y iproute2 二、yum&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y yum 三、ping&#xff1a;command not found 执行命…

Openlayers实战:多地图底图切换

在实际的地图项目中,不管是我们看到的百度地图还是高德地图等,都会有地图切换这一项。 在Openlayers实战中,我们用三种地图做demo,分别是谷歌地图。Openstreetmap,stamen地图。 切换的主要原则是设置三个底图层,设定其显示状态,用到了visible这一个属性。 效果图 源代码…

OpenCV for Python 入坑第一天:图像的基础操作

我们都知道&#xff0c;OpenCV能够帮助我们处理视频和图像&#xff0c;咱们在图像处理中&#xff0c;除了Pillow库之外&#xff0c;最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python&#xff0c;一起来感受一下OpenCV的魅力吧&#xff01; 文章目录 读取图像 im…

02LINGO基本操作

某公司新购置了某种设备 6 台&#xff0c;欲分配给下属的4 个企业&#xff0c;已知各企业获得这种设备后年创利润如表 1.1 所示&#xff0c;单位为千万元。问应如何分配这些设备能使年创总利润最大&#xff0c;最大利润是多少? 甲乙丙丁1423426455376764788657986671086 甲公…

国产芯片——单片机32位mcu的应用

随着物联网与人工智能和智能制造的发展&#xff0c;单片机作为嵌入式系统的核心控制器&#xff0c;在各类行业应用中占据重要位置。其中32位MCU在芯片设计、制造工艺、封装技术上等取得显著突破&#xff0c;以高性能的技术条件被广泛应用在智能物联等行业的方案开发中。今天我们…

txt文本筛选—python操作

需求&#xff1a;若文档中某行最后一列内容为0&#xff0c;则删除该行&#xff0c;否则保留该行内容&#xff0c;并将筛选后的内容保存到新的文本文档中。 # 读取原始txt文件 with open(depth_values.txt, r) as file:lines file.readlines()# 过滤掉第三列内容为0的行 filter…

Ubuntu22.04密码忘记怎么办 Ubuntu重置root密码方法

在Ubuntu 22.04 或其他更高版本上不小心忘记root或其他账户的密码怎么办&#xff1f; 首先uname -r查看当前系统正在使用的内核版本&#xff0c;记下来 前提&#xff1a;是你的本地电脑&#xff0c;有物理访问权限。其他如远程登录的不适用这套改密方法。 通过以下步骤&#…

解决打开excel时报错 “不能使用对象链接和嵌入”

问题截图 打开excel文件或者插入对象时&#xff0c;直接弹出不能使用对象链接和嵌入报错信息。 解决方法 按 winr 组合快捷键&#xff0c;打开运行&#xff0c;输入 dcomcnfg.exe 按回车确定 此时进入到组件服务管理界面&#xff0c;依次选择 组件服务-计算机-我的电脑-DOCM…

LaTex 1【字体、符号、表格】

​&#xff08;上一期已经安装完软件&#xff0c;但是突然出现了一点子问题不会解决&#xff0c;先用overleaf来学习吧&#xff0c;网站还是很给力的&#xff09; 关键字部分&#xff1a; \quad:代表空格【无论你打多少个空格都不是空格&#xff0c;要输入“\quad”】 字体部分…

ECMAScript 6 之二

目录 2.6 Symbol 2.7 Map 和 Set 2.8 迭代器和生成器 2.9 Promise对象 2.10 Proxy对象 2.11 async的用法 2.22 类class 2.23 模块化实现 2.6 Symbol 原始数据类型&#xff0c;它表示是独一无二的值。它属于 JavaScript 语言的原生数据类型之一&#xff0c;其他数据类型…

6.2.8 网络基本服务----万维网(www)

6.2.8 网络基本服务----万维网&#xff08;www&#xff09; 万维网即www&#xff08;World Wide Web&#xff09;是开源的信息空间&#xff0c;使用URL也就是统一资源标识符标识文档和Web资源&#xff0c;使用超文本链接互相连接资源&#xff0c;万维网并非某种特殊的计算机网…

Linux下Lua和C++交互

前言 lua&#xff08;wiki 中文 官方社区&#xff1a;lua-users&#xff09;是一门开源、简明、可扩展且高效的弱类型解释型脚本语言。 由于其实现遵循C标准&#xff0c;它几乎能在所有的平台&#xff08;windows、linux、MacOS、Android、iOS、PlayStation、XBox、wii等&…

【大数据之Hive】二十三、HQL语法优化之数据倾斜

1 数据倾斜概述 数据倾斜指参与计算的数据分布不均&#xff0c;即某个key或者某些key的数据量远超其他key&#xff0c;导致在shuffle阶段&#xff0c;大量相同key的数据被发往同一个Reduce&#xff0c;导致该Reduce所需的时间远超其他Reduce&#xff0c;成为整个任务的瓶颈。  …

数据结构与算法——什么是线性表(线性存储结构)

我们知道&#xff0c;具有“一对一”逻辑关系的数据&#xff0c;最佳的存储方式是使用线性表。那么&#xff0c;什么是线性表呢&#xff1f; 线性表&#xff0c;全名为线性存储结构。使用线性表存储数据的方式可以这样理解&#xff0c;即“把所有数据用一根线儿串起来&#xf…

海岸带地物分类步骤

1.读取图像 使用 Envi 打开 imageKSC.tif 影像。在 Toolbox 工具栏中选择 Spectral->Build 3D Cube。在 3D Cube File 对话框中选择高光谱数据集&#xff0c;显示信息为 614*512*176 的高光谱影像&#xff0c;单击 OK 按钮。 图1 原始影像 2.选择波段 当打开 3D Cube RGB…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

运输层(TCP运输协议相关)

运输层 1. 运输层概述2. 端口号3. 运输层复用和分用4. 应用层常见协议使用的运输层熟知端口号5. TCP协议对比UDP协议6. TCP的流量控制7. TCP的拥塞控制7.1 慢开始算法、拥塞避免算法7.2 快重传算法7.3 快恢复算法 8. TCP超时重传时间的选择8.1 超时重传时间计算 9. TCP可靠传输…

win10查看、关闭和开启多个mysql服务

我的之前安装了2个MySQL版本&#xff0c;一个是MySQL8.0.17&#xff0c;一个是MySQL5.7.19 为什么要查看怎么关闭MySQL服务?如果是个人电脑&#xff0c;我觉得开启一个服务相当于开启一个进程&#xff0c;可能会占用部分内存。如果自己是游戏摆烂状态&#xff08;非学习状态&…