当前位置: 首页 > news >正文

RabbitMQ实现消息发送接收——实战篇(路由模式)

本篇博文将带领大家一起学习rabbitMQ如何进行消息发送接收,我也是在写项目的时候边学边写,有不足的地方希望在评论区留下你的建议,我们一起讨论学习呀~

需求背景

先说一下我的项目需求背景,社区之间可以进行物资借用,当有社区提交物资借用申请时,需要通过RabbitMQ将这条消息发送到被借用物资的社区,同时在界面进行提示。

先把依赖引入一下

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

application.yml做好配置:

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest

工具类实现

先选择以何种方式进行消息发送,这里根据需求我选择使用RabbitMQ的路由模式进行消息发送,先来配置一下相应工具类:

先配置RabbitMQ的配置类

/*** @Title: RabbitMQConfig* @Author yinan* @Package com.yinan.config.RabbitConfig* @Date 2024/12/13 13:58* @description: RabbitMQ配置类*/
@Configuration
public class RabbitMQConfig {@Beanpublic RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {return new RabbitAdmin(connectionFactory);}//    声明一个交换机@Beanpublic DirectExchange borrowMaterialExchange(){return new DirectExchange("borrow_material_exchange");}//    动态绑定队列时使用的方法(具体绑定逻辑在下面的监听器中实现)
//    @Bean
//    public Queue communityQueue(){
//        return new Queue("communityQueue");
//    }@Beanpublic Jackson2JsonMessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}@Beanpublic AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(messageConverter());return rabbitTemplate;}
}

为了确保消息发送和接收时都以 JSON 格式处理,可以在 Spring 配置中添加 Jackson2JsonMessageConverter。这样,发送端会将 MaterialBorrowing 对象序列化为 JSON,接收端会自动将 JSON 反序列化回 MaterialBorrowing 对象。 

绑定交换机和对应队列

/*** @Title: RabbitMQBindRoutingConfig* @Author yinan* @Package com.yinan.config.RabbitConfig* @Date 2024/12/13 14:21* @description:  动态绑定路由配置*/
@Component
@Slf4j
public class RabbitMQBindRoutingConfig {@Autowiredprivate DirectExchange borrowMaterialExchange;@Autowiredprivate RabbitAdmin rabbitAdmin;/*** 以社区ID为路由键,为指定社区动态创建队列并绑定到交换机* @param communityId 社区ID*/public void bindRouting(String communityId){
//        创建队列Queue queue = new Queue("queue_" + communityId);
//        动态绑定交换机和指定队列Binding binding = BindingBuilder.bind(queue).to(borrowMaterialExchange).with(communityId);rabbitAdmin.declareExchange(borrowMaterialExchange);rabbitAdmin.declareBinding(binding);log.info("队列绑定成功,社区ID----》" + communityId + ",队列名称----》" + queue.getName() + ",交换机名称----》" + borrowMaterialExchange.getName());}}

动态声明队列

@Configuration
@Slf4j
public class QueueDeclareConfig {@Autowiredprivate RabbitAdmin rabbitAdmin;public void dynamicDeclareQueue(String communityId){String queueName = String.format("queue_%s",communityId);Queue queue = new Queue(queueName,true);rabbitAdmin.declareQueue(queue);log.info("队列声明成功");}
}

在创建声明队列的时候,我们希望的是根据我们的规则在调用接口的时候去创建指定名称的队列,所以可以使用动态声明对列而不是直接在平台上进行配置。

消息发送

@Component
@Slf4j
public class MessageSendConfig {@Autowiredprivate AmqpTemplate amqpTemplate;public void sendMessage(Object message,String communityId){System.out.println("发送消息:" + message);amqpTemplate.convertAndSend("borrow_material_exchange",communityId, message);log.info("发送消息成功------->"+message);}}

消息接收(动态声明与监听结合),这里你可以先思考一下为什么要用这种方式实现消息接收,而不是使用@RabbitListener去动态获取某个队列接收消息。

/*** @Title: MessageRecieveConfig* @Author yinan* @Package com.yinan.config.RabbitConfig* @Date 2024/12/13 12:53* @description: 动态监听接收消息*/
@Service
@Slf4j
public class MessageRecieveConfig<T> {private final ConnectionFactory connectionFactory;public MessageRecieveConfig(ConnectionFactory connection) {this.connectionFactory = connection;}public void recieveMessage(String communityId,Class<T> objectType){String queueName = String.format("queue_%s",communityId);
//        创建监听容器SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);container.setQueueNames(queueName);
//        处理消息消费逻辑container.setMessageListener(message -> {try {// 将字节数组转换为字符串String messageBody = new String(message.getBody(), StandardCharsets.UTF_8);System.out.println("接收到的消息:" + messageBody);// 如果需要将消息解析为对象(例如 MaterialBorrowing)ObjectMapper objectMapper = new ObjectMapper();T result = objectMapper.readValue(messageBody, objectType);System.out.println("反序列化后的消息:" + result);} catch (Exception e) {log.error("处理消息时发生错误:", e);}});// 确保自动确认container.setAcknowledgeMode(AcknowledgeMode.AUTO);container.start();log.info("动态监听已启动,监听队列------->"+queueName);}}

在你的项目中分别调用就行了,需要注意的是你必须确保在消息发送的时候你的队列已经创建完成且和对应交换机进行了绑定,不然可能会导致消息发送失败。

ok,我们启动项目

你会发现你的项目根本启动不起来,原因是因为对于 Spring AMQP 的监听器来说,必须确保监听的队列已经存在于 RabbitMQ 中,否则会抛出类似 DeclarationException 的错误。

所以我们考虑可以通过动态声明队列,在程序运行时确保 RabbitMQ 上创建好所需的队列。

动态声明队列的含义

动态声明队列是指程序在运行时,通过代码检查或创建 RabbitMQ 中尚不存在的队列,而不是手动预先配置好所有队列。这种方式可以自动帮你在 RabbitMQ 中创建所需的队列,而无需手动操作。

这里说一下为什么需要动态绑定队列而不直接使用@RabbitListener?

为什么使用 SimpleMessageListenerContainer 动态绑定队列

  • SimpleMessageListenerContainer 不需要在项目启动时绑定队列。你可以在用户调用接口时动态创建队列,并动态监听它。
  • 特点
    • 队列在用户调用接口时才会被动态创建(通过 RabbitAdmin 或其他机制)。
    • 动态创建队列和监听时,项目启动时不会尝试绑定不存在的队列,因此不会报错。
  • 适用场景:非常适合动态队列需求,比如队列名依赖用户输入或业务逻辑,且不想在项目启动时绑定固定的队列。

使用 @RabbitListener 的情况

@RabbitListener 会在项目启动时绑定到指定的队列。

  • 要求:如果绑定的队列在 RabbitMQ 中不存在,项目启动时就会抛出异常,类似 DeclarationException,这也就是上面为什么会报错的原因。
  • 解决办法
    • 提前创建队列:在 RabbitMQ 中手动创建队列,或通过 RabbitAdmin 在项目启动时自动创建队列。
    • 动态队列名:如果队列名是动态的,可以结合 SpEL 表达式,但队列仍然需要在项目启动时确保存在。
SpEL 表达式

如果你的需求中已经确定队列已经创建好的,但是需要动态去获取队列,可以使用如下形式:

@RabbitListener(queues = "#{T(java.lang.String).format('queue_%s', 'borrowedCommunityId')}")

这个表达式 是 Spring AMQP 中用于动态指定队列名称的 SpEL 表达式(Spring Expression Language),它的作用就是会动态生成一个队列名称,基于你传入的参数构造队列名。

详解
1. 关键部分解析
  • T(java.lang.String)

    • T 是 SpEL 用于引用 Java 类 的方式。
    • java.lang.String 是目标 Java 类,表明你可以调用 String 类的静态方法。
  • .format()

    • String.format() 是 Java 中的静态方法,用于格式化字符串。
    • 格式化字符串的格式是 'queue_%s'%s 是占位符,用于拼接动态内容。
  • 'queue_%s'

    • 这是格式化字符串的模板。%s 表示字符串占位符。
  • 动态参数(例如 borrowedCommunityId

    • 它会替换 %s,生成队列名。例如,当 borrowedCommunityId 的值是 123 时,结果是:queue_123
2. 具体实例

假设 borrowedCommunityId = "123"

String result = String.format("queue_%s", "123");
System.out.println(result); // 输出:queue_123

在 SpEL 中,这等同于:

queues = "#{T(java.lang.String).format('queue_%s', '123')}"

这会动态生成队列名称为 queue_123


为什么用 SpEL?

Spring AMQP 的 @RabbitListener 注解中,queues 参数支持 SpEL 表达式。这使得我们可以动态决定要监听的队列,而不是写死某个固定的队列名称。


实际应用场景

就比如在我的代码中,可能有多个社区队列,例如:

  • queue_123(社区 ID 为 123 的队列)
  • queue_456(社区 ID 为 456 的队列)

使用 queues = "#{T(java.lang.String).format('queue_%s', borrowedCommunityId)}",可以动态生成不同社区的队列名称,从而实现按社区路由的功能。

启动项目之后,调用接口就可以发送消息了

但是你会发现消息消费的逻辑并没有在控制台中打印出来,这个时候你就要考虑是不是以下几个问题了:

交换机和队列是否已经绑定成功(可以在平台上进行查看)

是否绑定到了对应的交换机:amqpTemplate.convertAndSend("borrow_material_exchange",communityId, message);红色部分指定交换机名称,如果不指定,那么就会使用默认的交换机,所以肯定也是接收不到值的。

当然,还有其他可能,如果你的项目中遇到了,可以在评论区留言,我们一起学习~

最后,重新修改代码调用接口,就可以接收到消息了

对于在界面进行消息提示的功能,这里先不写出来了,我会在后面的博客中进行更新~

【都看到这了,点赞加关注,收藏不迷路呀~】😚😚

相关文章:

RabbitMQ实现消息发送接收——实战篇(路由模式)

本篇博文将带领大家一起学习rabbitMQ如何进行消息发送接收&#xff0c;我也是在写项目的时候边学边写&#xff0c;有不足的地方希望在评论区留下你的建议&#xff0c;我们一起讨论学习呀~ 需求背景 先说一下我的项目需求背景&#xff0c;社区之间可以进行物资借用&#xff0c…...

Docker Desktop占用空间问题解决

Windows安装Docker Desktop&#xff0c;没过多久就会发现C盘空间满了&#xff0c;很大可能是Docker Desktop的文件占用了空间&#xff0c;可以通过以下步骤解决&#xff1a; 步骤一&#xff1a;执行清理命令 docker system prune清理磁盘&#xff0c;删除关闭的容器、无用的数…...

系统性能优化

一、概述 性能优化的目标&#xff1a;是提高系统或应用程序的响应时间、吞吐量、cpu、内存、磁盘IO、网络、流量、JVM、Tomcat、DB等方面的性能指标。 性能优化需要有一些技巧&#xff1a;对于整个产品或项目而言&#xff0c;比如可以从前端优化、后端优化、架构优化、高并发…...

golang操作sqlite3加速本地结构化数据查询

目录 摘要Sqlite3SQLite 命令SQLite 语法SQLite 数据类型列亲和类型——优先选择机制 SQLite 创建数据库SQLite 附加数据库SQLite 分离数据库 SQLite 创建表SQLite 删除表 SQLite Insert 语句SQLite Select 语句SQLite 运算符SQLite 算术运算符SQLite 比较运算符SQLite 逻辑运算…...

【NebulaGraph】mac通过Docker安装以及官方查询示例、以及索引详解还有数据构建案例(五)

【NebulaGraph】mac通过Docker安装以及官方查询示例 1. Docker安装NebulaGraph2. 官方查询示例3. Nebula Graph 的 Java 数据解析实践与指导4. 从零到一&#xff1a;如何构建一个企业股权图谱系统&#xff1f;5. Nebula Graph 索引详解6. nGQL 执行计划详解与调优7. 图数据库的…...

【一本通】家庭作业(贪心算法)

【一本通】家庭作业 C语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 老师在开学第一天就把所有作业都布置了&#xff0c;每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业…...

Kylin麒麟操作系统 | 网络链路聚合配置(team和bond)

目录 一、理论储备1. 链路聚合 二、任务实施1. team模式2. bond模式 一、理论储备 1. 链路聚合 链路聚合是指将多个物理端口捆绑在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量在各成员端口中的负载分担。链路聚合在增加链路带宽、实现链路传输弹性和冗余等…...

2024年软件测试面试题大全【含答案】

一、面试基础题 简述测试流程: 1、阅读相关技术文档&#xff08;如产品PRD、UI设计、产品流程图等&#xff09;。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例&#xff08;等价类划分法、边界值分析法等&#xff09;。 5、用例评审(…...

Stable Diffusion 提示词语法

1.提示词基础 1.提示词之间用英文逗号,分隔 2.提示词之间是可以换行的 3.权重默认为1,越靠前权重越高 4.数量控制在75个单位以内 2.提示词各种符号的意义 2.1 ()、[]、{}符号 权重值()小括号[]中括号{}大括号默认1111层()1.1[]0.9{}1.052层(()) 1.121.21[[]]0.920.81{{}}1.…...

Y20030004基于asp.net+Sql的环保网站的设计与实现(附源码 调试 文档)

环保网站的设计与实现 1.摘要要2. 系统功能3.功能结构图4.界面展示5.源码获取 1.摘要要 近几年国家对于环境管理是高度重视&#xff0c;尤其是对于环境生态的破坏与环境污染&#xff0c;已经严重影响到人类的生存和发展。为了使生态环境能够得到保护和改善&#xff0c;持续发展…...

OpenCV的简单练习

1、读取一张彩色图像并将其转换为灰度图。 import matplotlib.pyplot as pltimg plt.imread("./flower.png") # 灰度化 img_gray img[:,:,0]*0.299 img[:,:,1]*0.587 img[:,:,2]*0.114plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(img_gray,c…...

VS2019中无法跳转定义_其中之一情况

我习惯了使用VS2019看stm的代码&#xff1b; 遇到的问题&#xff0c;在导入代码后&#xff0c;发现有些函数调用不能跳转到定义&#xff1b; 问题描述步骤 1、导入代码 2、跳转&#xff0c;无法跳转 1、中文路径 2、删除.vs文件 和网上查的都没办法解决 最后发现是VS不支持 …...

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色...

【C语言】多线程服务器

多线程服务器 多线程服务器步骤代码 多线程服务器 步骤 主线程创建子线程&#xff0c;用子线程和客户端通信。 步骤&#xff1a; 1.使用socket函数&#xff0c;获取一个socket文件描述符 2.使用setsockopt端口复用 3.使用bind函数允许客户端的哪些ip可以访问服务器 4.使用lis…...

跨平台轻量级RTSP技术设计和使用场景探讨

设计背景 跨平台内网超低延迟直播的创新引擎 为满足安防视频监控、教育培训、工业生产、医疗健康、智能物联网等内网超低延迟需求&#xff0c;避免让用户配置单独的服务器&#xff0c;大牛直播SDK在推送端发布了跨平台&#xff08;Windows|Linux&#xff08;含x86_64|aarch64…...

分解质因数

题目描述 给定 n个正整数a&#xff0c;将每个数分解质因数&#xff0c;并按照质因数从小到大的顺序输出每个质因数的底数和指数。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c;每行包含一个正整数 a。 输出格式 对于每个正整数 aiai&#xff0c;按照从小到大的顺…...

wordpress建站--如何用Let‘s Encrypt给网站添加免费ssl证书,支持https访问

本文首发网站&#xff1a;https://www.click234.com 默认情况下我们的网站是http访问&#xff0c;为了增加访问安全性&#xff0c;我们需要添加ssl证书&#xff0c;支持采用https方式访问&#xff0c;今天我们来看下怎么创建免费的ssl证书--Lets Encrypt 使用 Certbot 自动化工…...

web实操7——ServletContext

概念 和服务器通信 功能 解释说明&#xff1a; mime&#xff1a;互联网中一种文件的类型&#xff0c;可以用servletContext对象来获取。 域对象&#xff1a;用来共享数据&#xff0c;里面有一些get,set,removeAttribute,只要搞清楚ServletContext对象的域的范围是什么 如何…...

Android中bindService和startService启动服务有何区别

Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式&#xff0c;它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比&#xff1a; 1. bindService方式 bindService 是一种绑定方式&am…...

Jupyter Notebook 切换虚拟环境

方法 切换到需要添加到Jupyter Notebook中的虚拟环境&#xff0c;执行&#xff1a; python -m ipykernel install --name Jupyter Notebook中显示的虚拟环境名称如果遇到 [Errno 13] Permission denied: /usr/local/share/jupyter类似的权限问题&#xff0c;可能是没有对应的…...

短波红外相机

短波红外相机搭载采用 SenSWIR 技术的 Sony 高灵敏度传感器&#xff0c;能捕获到400nm~1700nm范围的可见光-短波红外宽波段图像信息&#xff0c;该相机可替代传统的“可见光相机短波红外相机”双相机检测方案&#xff0c;降低系统成本、提高处理速度、扩大检测范围&#xff0c;…...

余弦相似度Cosine Sim

what 余弦相似度是一种用于度量向量相似性的metric。 c o s θ A . B ∣ A ∣ . ∣ B ∣ cos\theta \frac{A.B}{|A|.|B|} cosθ∣A∣.∣B∣A.B​ A.B&#xff1a;向量的内积|A|&#xff1a;向量的模长 c o s θ cos\theta cosθ&#xff1a;的范围$ [ -1 , 1 ] $ why 余弦…...

【从零开始的LeetCode-算法】1338. 数组大小减半

给你一个整数数组 arr。你可以从中选出一个整数集合&#xff0c;并删除这些整数在数组中的每次出现。 返回 至少 能删除数组中的一半整数的整数集合的最小大小。 示例 1&#xff1a; 输入&#xff1a;arr [3,3,3,3,5,5,5,2,2,7] 输出&#xff1a;2 解释&#xff1a;选择 {3,7…...

测试工程师八股文05|功能测试、业务测试

一、基础概念 1、软件测试分类 1️⃣按照软件产生的阶段划分 单元测试&#xff1a;针对程序源代码进行测试【开发自测】集成测试&#xff1a;针对模块之间功能交互进行测试系统测试&#xff1a;对整个系统&#xff08;功能、非功能&#xff09;进行全面测试验收测试&#xff…...

【电源专题】开关转换器使能(EN)和欠压锁定(UVLO)为什么需要回滞?

在文章:【电源专题】案例:芯片规格书使能定义高电平最小阈值1.4V,那真的是到1.4V时才开始输出?_芯片的电流阀值-CSDN博客中我们提到一般来说开关转换器的使能脚是有一个回滞的,比如下图所示的芯片规格书...

TS的类型守卫、类型约束实践

类型守卫 // 基础类型判断 const arr [30, 50] console.log(typeof arr) // object const set new Set(arr) console.log(typeof set) // object const map new Map() console.log(typeof map) // objectclass Customer {constructor() {}buy(method:string) {console.log(…...

Thread线程基础使用

多线程目的&#xff1a;其实就是希望“并行”执行多任务&#xff0c;提升效率。 单核多线程基于时间片轮询 并发而非并行 线程最大数等于cpu核心数为佳 namespace thinger.ThreadDemo {class Program{//主线程static void Main(string[] args){Console.WriteLine("这个…...

番外篇 | BGF-YOLO:引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8检测性能

前言:Hello大家好,我是小哥谈。本文提出了一种名为BGF-YOLO的新模型,通过引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8在脑肿瘤检测中的性能,采用多层特征融合与动态稀疏注意机制以减少特征冗余。 🌈 目录 🚀1.基础概念 🚀2.网络结构 �…...

15-从 TypeScript 到 ArkTS 的适配规则(5)

15-从 TypeScript 到 ArkTS 的适配规则&#xff08;5&#xff09; 不支持确定赋值断言 **规则&#xff1a;**arkts-no-definite-assignment 级别&#xff1a;警告 ArkTS不支持确定赋值断言&#xff0c;例如&#xff1a;let v!: T。改为在声明变量的同时为变量赋值。 TypeS…...

UniApp配置使用原子化tailwindcss

参考视频 创建项目 新建项目选择uniapp - vue版本这里我选择3 - 点击创建即可 创建完成后&#xff0c;如果是要编译到小程序的项目则可以先将项目运行到小程序打开了 初始化package.json 执行 npm init -y安装和配置 安装 npm i -D tailwindcss postcss autoprefixer # 安…...

魅族手机刷官方系统

从魅族官网下载固件 https://flyme.cn/firmware.html 找到自己的型号&#xff0c;里面有历史版本、最新版&#xff0c;按照需求下载。 下载的是update.zip&#xff0c;改名就不能升级了 方法1 直接点击下载的update.zip包就可以升级。 方法2 将文件移动到文件管理的根目录&a…...

【欧几里得算法以及扩展欧几里得算法】

欧几里得算法 假设有两个非负整数 a , b a,b a,b,并且 a , b a,b a,b都不等于0&#xff0c;那么 a , b a,b a,b的最大公约数等于其中较小的数和 a , b a,b a,b相除的余数的最大公约数。 用公式表达为 g c d ( a , b ) g c d ( b , a ( m o d b ) ) gcd(a,b)gcd(b,a\pmod{b})…...

CentOS7 Apache安装踩坑

Gnome桌面右键弹出终端。 [rootlocalhost ~]# yum repolist 已加载插件&#xff1a;fastestmirror, langpacks /var/run/yum.pid 已被锁定&#xff0c;PID 为 2611 的另一个程序正在运行。 Another app is currently holding the yum lock; waiting for it to exit... [root…...

c#基于tcp的打印机共享程序可以打印图片

c sharp 基于tcp共享图片打印程序: 基于c#的tcp打印服务程序https://gitee.com/paoxi/tcpprint代码已经开源 执行文件在下方 tcp打印发送端 庖犠/c sharp 基于tcp共享图片打印程序 - Gitee.comhttps://gitee.com/paoxi/tcpprint/releases/tag/0.9...

二分查找算法

目录 1.二分查找 2.在排序数组中查找元素的第一个和最后一个位置 2.1题目解析 2.2算法原理 2.3编写代码 3.x的平方根 3.1题目解析 3.2算法原理 3.3编写代码 4.搜索插入位置 4.1题目解析 4.2算法原理 4.3编写代码 5.山脉数组的峰顶索引 5.1题目解析 5.2算法原理 …...

【Python技术】同花顺wencai涨停分析基础上增加连板分析

周末&#xff0c;有读者加我&#xff0c; 说 之前的涨停分析 是否可以增加连板分析。 这个可以加上。 先看效果 这里附上完整代码&#xff1a; import streamlit as st import pywencai import pandas as pd from datetime import datetime, timedelta import plotly.graph_o…...

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…...

mp4影像和m4a音频无损合成视频方法

第一步&#xff1a;复制高清视频地址 url 第二步:打开网址粘贴复制的视频url视频下载 第三步&#xff1a;下载-影像.mp4和-音频.m4a 第四步&#xff1a;合并视频&#xff1b; 使用ffmpeg进行无损合成&#xff08;如果没有安装ffmpeg请自行下载安装下载 FFmpeg (p2hp.com)&…...

CEF 数据加密与网络安全

随着网络攻击的日益猖獗&#xff0c;确保应用的安全性已经成为开发者的首要任务。特别是在现代Web应用中&#xff0c;如何确保数据的加密存储、网络通信的安全性以及有效的认证机制成为至关重要的问题。对于基于 Chromium Embedded Framework (CEF) 的应用&#xff0c;开发者必…...

【Linux学习】十五、Linux/CentOS 7 用户和组管理

Linux下组和用户的管理都必须是root用户下进行&#xff1a; 一、组的管理 1.组的创建 格式&#xff1a; groupadd 组名参数&#xff1a; -g&#xff1a;指定用户组的组ID&#xff08;GID&#xff09;&#xff0c;如果不提供则由系统自动分配。 【案例】创建一个名为 oldg…...

C语言实现图片文件的复制

在C语言中&#xff0c;直接处理图片文件&#xff08;如JPEG、PNG等&#xff09;的复制&#xff0c;通常涉及到文件I/O操作。这些图片文件是二进制文件&#xff0c;因此需要使用二进制模式读取和写入文件。 图片文件复制代码&#xff1a; #include <stdio.h> #include&l…...

噪杂环境(房车改装市场)离线语音通断器模块

一直在坚持&#xff0c;却很难有机会上热门&#xff0c;在现在这个以流量为导向的时代&#xff0c;貌似很难靠所谓的坚守和热爱把产品成功的推向市场了。目前的客户仍然是以老客户为主&#xff0c;应用场景主要是房车改装&#xff0c;根据九客户的需求定制化一些模块。因为没有…...

网络安全知识点

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 1.2.3 网络安全的种类P5 &#xff08;1…...

QT<32>软件子页面最小化后再次点击置顶显示

一、前言 在 Qt 中&#xff0c;当一个窗口被最小化后&#xff0c;再次点击恢复它时&#xff0c;默认情况下&#xff0c;窗口恢复的方式可能并不总是显示在最顶层。这通常是因为窗口恢复后会被置于操作系统的默认层次结构中&#xff0c;而不是直接处于最上层。为了确保恢复后的窗…...

TCP 数据传输的拆包和粘包了解吗?

前言&#xff1a; 上一篇我们了解了什么是 TCP 协议&#xff0c;以及 TCP 协议 3 次握手 4次挥手的原因&#xff0c;本篇来分享一下 TCP 数据的传输过程的拆包和粘包&#xff0c;以及 TCP 数据传输过程中的一些细节。 计算机网络往期文章 TCP 为什么是 3 次握手 4 次挥手&am…...

Ubuntu常用自救方案

一、开机进入终端界面 莫名其妙进入终端界面了且死活出不来&#xff0c;原因可能是下载了些不该下的&#xff0c;或者卸载了些不能卸的。 万一真是这样可以尝试以下方法&#xff1a; 1.安装图形界面 第一行必安&#xff0c;2、3没试过 sudo apt-get install ubuntu-desktop …...

决策曲线分析(DCA)中平均净阈值用于评价模型算法(R自定义函数)

决策曲线分析&#xff08;DCA&#xff09;中平均净阈值用于评价模型算法 DCA分析虽然不强调用来评价模型算法或者变量组合的优劣&#xff0c;但是实际应用过程中感觉DCA曲线的走势和模型的效能具有良好的一致性&#xff0c;其实这种一致性也可以找到内在的联系&#xff0c;比如…...

【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut、QT)第三期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…...

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效…...

深度解析相对路径、绝对路径与URL映射策略、MVC架构

一、相对路径与绝对路径的概念与应用 路径管理是Web开发中的核心概念之一。理解不同类型的路径如何影响文件和资源的访问对于确保代码的灵活性、可维护性和可移植性至关重要。 1. 相对路径 相对路径是指相对于当前文件或目录的位置来指定目标资源的路径。它不依赖于绝对的服…...