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

目录

一、问题背景

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

1.引入依赖

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


一、问题背景


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

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

java 复制代码
@Configuration
public class FanoutConfig {

    @Bean
    public Queue objectQueue() {
        return new Queue("object.queue");
    }

}
java 复制代码
    @Test
    public 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,基于JDK的ObjectOutputStream完成序列化。

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

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

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


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

具体步骤如下:

1.引入依赖

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

XML 复制代码
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

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

使用 @Bean 注解注入即可

java 复制代码
@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

}
java 复制代码
@SpringBootApplication
public class PublisherApplication {
    public static void main(String[] args) {
        SpringApplication.run(PublisherApplication.class);
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
    
}

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

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

相关推荐
Lhan.zzZ2 小时前
Qt:动态库模块框架设计
开发语言·c++·qt
yz_aiks2 小时前
RestTemplate 废弃后迁移 RestClient 实战:Spring Boot 4.2 升级指南
java·spring boot·后端·微服务·restclient
quantdash_cc2 小时前
如何从多只股票的历史行情构建收益率矩阵?Python 与 QuantDash 实战教程
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
wuminyu2 小时前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
不是万能的豆学长6 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
时间静止不是简史6 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428049 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
懂点Tech11 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
金銀銅鐵12 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin12 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php