【SpringBoot】HttpServletRequest获取使用及失效问题(包含@Async异步执行方案)
目录
1. 在 Controller 方法中作为参数注入
2.使用 RequestContextHolder
(1)失效问题
(2)解决方案一:
(3)解决方案二:
3、使用@AutoWrite自动注入HttpServletRequest
跨线程调用失效问题:
补充:什么是@Async:
(1) 启用异步支持
(2)在你想异步执行的方法上加 @Async
(3)调用这个方法(注意!不要在同一个类中自调用)
(4)注意事项
(5)完整示例:
大家好,我是jstart千语。我们做项目时,通常要使用到HttpServletRequest来进行对请求响应的消息进行处理,本篇给大家带来三种获取HttpServletRequest的方式。
1. 在 Controller 方法中作为参数注入
SpringMVC会自动注入:
@RestController
public class MyController {@GetMapping("/example")public String example(HttpServletRequest request) {String clientIp = request.getRemoteAddr();return "Client IP: " + clientIp;}
}
2.使用 RequestContextHolder
如果你不在 Controller 中,而是在 Service、Util 类等位置想获取当前的请求对象,可以使用:
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;public class MyService {public void doSomething() {// 获取当前请求的上下文ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes != null) {// 获取 HttpServletRequestHttpServletRequest request = attributes.getRequest();// 使用请求信息(如获取 Header、参数等)String userAgent = request.getHeader("User-Agent");String paramValue = request.getParameter("paramName");// 获取 HttpServletResponseHttpServletResponse response = attributes.getResponse();}}
}
(1)失效问题
注意点:
RequestContextHolder 使用的是 ThreadLocal 存储当前请求的上下文信息。一旦你离开当前请求线程(例如新开线程),这些上下文信息就不会自动传递过去。如:
@RequestMapping("/async-test")
public String asyncTest() {new Thread(() -> {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // 值为 null}).start();return "OK";
}
(2)解决方案一:
提前取出你想要的值,然后以参数形式传入线程内部,这样就不会有上下文丢失的问题。
@RequestMapping("/async-test")
public String asyncTest(HttpServletRequest request) {// 主线程中先获取你需要的信息String uri = request.getRequestURI();String clientIp = request.getRemoteAddr();// 把值作为参数传给异步线程new Thread(() -> {System.out.println("异步线程中访问 URI: " + uri);System.out.println("异步线程中客户端 IP: " + clientIp);}).start();return "OK";
}
(3)解决方案二:
如果用的是 @Async,可以启用上下文传递。
Spring 5.3 开始提供了 TaskDecorator,可以用它将当前的请求上下文“包装”起来传给异步线程。
1、定义一个TaskDecorator:
import org.springframework.core.task.TaskDecorator;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;public class ContextCopyingDecorator implements TaskDecorator {@Overridepublic Runnable decorate(Runnable runnable) {RequestAttributes context = RequestContextHolder.getRequestAttributes();return () -> {try {RequestContextHolder.setRequestAttributes(context);runnable.run();} finally {RequestContextHolder.resetRequestAttributes();}};}
}
2、配置线程池使用这个装饰器:
@Configuration
@EnableAsync
public class AsyncConfig {@Beanpublic TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setTaskDecorator(new ContextCopyingDecorator());executor.setCorePoolSize(5);executor.initialize();return executor;}
}
3、使用@AutoWrite自动注入HttpServletRequest
说明:
Spring 注入的是一个代理对象(HttpServletRequest 是 request scope 的 bean),这个代理在每个请求到达时会根据当前线程,自动定位到当前线程的真实请求对象。
通过自动注入的HttpServletRequest本质上也是一个RequestContextHolder,代理内部每次调用方法(比如 getRequestURI())时,都会通过 RequestContextHolder.getRequestAttributes() 找 当前线程绑定的 request 对象。
所以自动注入的方式不适用的场景跟使用RequestContextHolder相同。
使用示例:
@Component
public class LogService {@Autowiredprivate HttpServletRequest request;public void printLog() {System.out.println("请求地址: " + request.getRequestURI());}
}
跨线程调用失效问题:
- 使用自动注入的方式,因为注入的是一个代理对象。
- 代理对象是和线程绑定的,调用HttpServletRequest调用方法()如getRequestURI()),会通过RequestContextHolder.getRequestAttributes(),找 当前线程绑定的 request 对象
- 所以如果将主线程的HttpServletRequest赋值给了其他线程使用,也是使用不到的
失效问题举例详解:
1、把request对象放入全局变量:
public void storeRequestObject() {globalMap.put("lastRequest", request); }
2、另一个线程取出来使用:
// 假设这是另一个线程: HttpServletRequest req = globalMap.get("lastRequest"); String uri = req.getRequestURI(); // ❌ 此时 request 对应的 ThreadLocal 是空的,报错!
你把 request 这个代理对象存进去后,其他线程如果取出来用,就会出错。因为 这个线程没有设置自己的 RequestContextHolder,调用时会拿不到实际的 request 实例,就会报错
解决:完成线程之间共享
存储真正的 request 信息,而不是 request 对象
public void storeRequestInfo() {String uri = request.getRequestURI(); // 当前线程获取globalMap.put("lastRequestUri", uri); // 只存具体信息,不存对象 }
补充:什么是@Async:
@Async 是 Spring 提供的一个注解,用来让你的方法异步执行(非阻塞)。它背后是线程池 + AOP 实现的。你只需要加个注解,Spring 就会帮你把方法在新线程里执行,非常适合处理不需要立刻返回的任务,比如发送邮件、日志记录、异步通知等等。
(1) 启用异步支持
在你的 Spring Boot 启动类或者配置类上加上:
@EnableAsync
@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}
(2)在你想异步执行的方法上加 @Async
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class MyService {@Asyncpublic void doAsyncTask() {System.out.println("开始执行异步任务,线程名:" + Thread.currentThread().getName());try {Thread.sleep(3000); // 模拟耗时任务} catch (InterruptedException e) {e.printStackTrace();}System.out.println("异步任务完成");}
}
(3)调用这个方法(注意!不要在同一个类中自调用)
@RestController
public class TestController {private final MyService myService;public TestController(MyService myService) {this.myService = myService;}@GetMapping("/start-task")public String startTask() {myService.doAsyncTask(); // 异步执行,不会阻塞这个接口的返回return "任务已提交";}
}
(4)注意事项
- @Async 方法必须是 public 的。
- @Async 方法不能是自己类内部调用(会失效),必须是通过 Spring 容器的代理调用(也就是从别的类调它)。
- 返回值可以是 void、Future<T>、CompletableFuture<T> 等。
(5)完整示例:
示例结构:
- @Async 异步方法
- 使用 RequestContextHolder 获取请求信息
- 配置线程池 + 自定义 TaskDecorator
- 测试 Controller 发起异步请求
a.引入依赖(spring-boot-starter-web 和 spring-boot-starter 已包含 @Async 所需依赖)
<!-- pom.xml -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
b.自定义 TaskDecorator:让请求上下文穿透到异步线程
import org.springframework.core.task.TaskDecorator;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;public class ContextCopyingTaskDecorator implements TaskDecorator {@Overridepublic Runnable decorate(Runnable runnable) {RequestAttributes context = RequestContextHolder.getRequestAttributes();return () -> {try {RequestContextHolder.setRequestAttributes(context);runnable.run();} finally {RequestContextHolder.resetRequestAttributes();}};}
}
c.配置异步线程池并应用装饰器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@EnableAsync
public class AsyncConfig {@Bean("customTaskExecutor")public TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.setThreadNamePrefix("async-exec-");executor.setTaskDecorator(new ContextCopyingTaskDecorator());executor.initialize();return executor;}
}
d. 异步服务类中使用 @Async 并获取请求信息
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;@Service
public class AsyncService {@Async("customTaskExecutor")public void processAsyncTask() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String uri = request.getRequestURI();String clientIp = request.getRemoteAddr();System.out.println("【异步线程】处理请求 URI: " + uri);System.out.println("【异步线程】客户端 IP: " + clientIp);// 模拟耗时操作try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("【异步线程】任务处理完毕");}
}
e.Controller 提交异步任务
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {private final AsyncService asyncService;public TestController(AsyncService asyncService) {this.asyncService = asyncService;}@GetMapping("/start-async")public String startAsyncTask() {asyncService.processAsyncTask(); // 调用异步方法return "异步任务已提交,主线程立即返回";}
}
f.测试结果示例
http://localhost:8080/start-async
控制台输出类似:
【异步线程】处理请求 URI: /start-async
【异步线程】客户端 IP: 127.0.0.1
【异步线程】任务处理完毕
相关文章:
【SpringBoot】HttpServletRequest获取使用及失效问题(包含@Async异步执行方案)
目录 1. 在 Controller 方法中作为参数注入 2.使用 RequestContextHolder (1)失效问题 (2)解决方案一: (3)解决方案二: 3、使用AutoWrite自动注入HttpServletRequest 跨线程调…...
【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 为什么需要手动转换 feign.Response 到 HttpServletResponse? feign.Response 是 Feign 客户端调用远程服务后返回的原始 HTTP 响应对象,而 HttpServletResponse 是…...
C语言交换函数:为什么必须用指针传递参数?
写一个简单交换两个变量值的函数,我们要理解C语言中参数传递的机制. C语言中的函数参数默认是按值传递,也就是说,如果我写一个函数,如 void swap(int a,int b) {int tmp a;a b;b tmp; }然后在函数内部交换a,b的值,这不会影响到函数外部的变量,因为传递的是值的副本. 就像…...
C#+Visual Studio 2022为AutoCAD 2022开发插件并显示在Ribbon选项卡
1.插件功能开发 (1)建立C#类库项目,添加必要引用,都是autocad二次开发相关的,要注意对引用的库修改其“复制文件”属性为false (2)项目调试使用“属性”打开“启用外部程序”,指定为机器上autocad2022的a…...
全景VR是什么?全景VR有什么热门用途?
全景VR的概念与技术特点 全景VR,即虚拟现实全景,是新型的视觉展示技术。通过拍摄和构建三维模拟环境,使浏览者能够通过网络获得三维立体的空间感觉,仿佛身临其境。全景VR技术的核心在于360全景图像的捕捉和展示,它允许…...
美创科技20周年庆典顺利举行
2025年4月19日 美创科技成立20周年 “稳健前行二十载,创新共赢新未来” 美创科技周年庆典在杭州总部顺利举行 美创科技20周年庆典精彩视频回顾 (点击查看美创科技20周年庆典精彩视频回顾) CEO致辞 20周年再出发,开启新增长周期…...
学习笔记二十二—— 并发五大常见陷阱
⚠️ 并发五大常见陷阱 目录 数据竞争 (Data Race)死锁 (Deadlock)竞态条件 & 饿死现象 (Race Condition & Starvation)悬挂指针 (Dangling Pointer)重复释放 (Double Free)开发自查清单 1. 数据竞争 (Data Race) 专业定义 两个及以上线程在缺乏同步的情况下同时访问同…...
精益数据分析(10/126):深度剖析数据指标,驱动创业决策
精益数据分析(10/126):深度剖析数据指标,驱动创业决策 在创业的旅程中,数据指标是我们把握方向的关键工具。今天,我想和大家一起深入学习《精益数据分析》中关于数据指标的知识,共同探索如何利…...
冒泡排序详解
void bubbleSort(std::vector& arr) { int n arr.size(); for (int i 0; i < n-1 ; i) { // 需要 n-1 轮 原理是 3个元素 两轮比交即可 10个元素9轮比较即可 bool swapped false; // 用于优化,检测是否发生交换 for (int j 0; j < n - i -1 ; j) { //…...
小刚说C语言刷题——1039 求三个数的最大数
1.题目描述 已知有三个不等的数,将其中的最大数找出来。 输入 输入只有一行,包括3个整数。之间用一个空格分开。 输出 输出只有一行(这意味着末尾有一个回车符号),包括1个整数。 样例 输入 1 5 8 输出 8 2.…...
【日志体系】ELK Stack与云原生日志服务
IaaS日志体系:ELK Stack与云原生日志服务 一、技术演进的双重脉络二、架构设计的范式差异三、关键技术突破解析四、前沿发展与行业实践 当某国际电商平台在"黑色星期五"遭遇每秒百万级日志洪峰时,其运维团队通过混合日志架构实现全链路追踪&am…...
spark和hadoop区别联系
区别 设计理念 Hadoop:主要解决大规模数据的存储和处理问题,其核心是 Hadoop 分布式文件系统(HDFS)和 MapReduce 计算模型。HDFS 用于存储大规模数据,MapReduce 用于处理数据,它将数据处理过程分为 Map 和…...
240422 leetcode exercises
240422 leetcode exercises jarringslee 文章目录 240422 leetcode exercises[237. 删除链表中的节点](https://leetcode.cn/problems/delete-node-in-a-linked-list/)🔁节点覆盖法 [392. 判断子序列](https://leetcode.cn/problems/is-subsequence/)🔁…...
【上位机——MFC】菜单类与工具栏
菜单类 CMenu,封装了关于菜单的各种操作成员函数,另外还封装了一个非常重要的成员变量m_hMenu(菜单句柄) 菜单使用 添加菜单资源加载菜单 工具栏相关类 CToolBarCtrl-》父类是CWnd,封装了关于工具栏控件的各种操作。 CToolBar-》父类是CC…...
Spark-SQL连接Hive总结及实验
一、核心模式与配置要点 1. 内嵌Hive 无需额外配置,直接使用,但生产环境中几乎不使用。 2. 外部Hive(spark-shell连接) 配置文件:将hive-site.xml(修改数据库连接为node01)、core-site.xml、…...
20.3 使用技巧9
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.3.13 DataGridView使用日期选择控件 有时为了输入方便或者固定日期格式,可以考虑点击DataGridView中某个单元格时出现…...
逻辑回归(Logistic Regression)
逻辑回归(Logistic Regression) 原理 通过 Sigmoid函数( σ ( z ) 1 1 e − z σ(z) \frac{1}{1e^{-z}} σ(z)1e−z1)将线性回归输出 z w T x b z w^Tx b zwTxb 映射到 [0,1] 区间输出值表示样本属于正类的概率&#…...
weblogic12 部署war包 项目运行报错
问题表现 weblogic12 部署war包项目成功,运行启动成功。但是在使用此项目的时候,点击任何功能都会报错,部分报错如下: at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.…...
重新定义户外防护!基于DeepSeek的智能展开伞棚系统技术深度解析
从“手动操作”到“感知决策”,AI重构城市空间弹性 全球极端天气事件频发,传统伞棚依赖人工展开/收纳,存在响应滞后(暴雨突袭时展开需3-5分钟)、抗风能力弱(8级风损毁率超60%)、空间利用率低等痛…...
Android15沉浸式界面顶部有问题
Android15沉浸式界面顶部有问题 往往开发人员的手机没这么高级,客户或者老板的手机是Android15的。 我明明就设了状态栏透明,我的手机也没问题。但Android15是有问题的。 先看下有问题的界面: 解决方案: 处理1: if (…...
git比较不同分支的不同提交文件差异
背景:只想比较某2个分支的某2次提交的差异,不需要带上父提交。 以commitA为基准,用commitB去比较差异 直接上代码: #!/bin/bashcommitAd347dad9f25fb17db89eadcec7ea0f1bacbf7d29 commitBa6cc0c1a863b5c56d5f48bff396e4cd6966e…...
ADB -> pull指令推送电脑文件到手机上
ADB Push命令 在Android开发中,ADB的push命令用于将文件从电脑传输到Android设备上,是开发和测试过程中的重要工具 基本语法 adb push <本地文件路径> <设备目标路径><本地文件路径>:必需参数,指定要推送的本…...
compat-openssl10和libnsl下载安装
在麒麟系统(如银河麒麟)中,compat-openssl10 和 libnsl 是一些软件(如 MySQL、Oracle 等)的依赖包,用于提供兼容性支持。以下是它们的下载方法: 1. 下载 compat-openssl10 compat-openssl10 是…...
射频功率放大器的核心工作机制与组件设计
以下是关于射频功率放大器工作原理的详细说明: 射频功率放大器(RF PA)是无线通信系统的核心组件,其功能基于能量转换与信号放大技术。它通过精确的能量控制与信号处理,将低功率射频信号转化为高功率输出,支…...
制作一款打飞机游戏12:初稿原型
当前进展 任务回顾:在之前,我们做了大量的规划和原型设计。我们创建了关卡,添加了侧向滚动和BOSS模式背景重复,还制作了一个紧凑的瓦片集。原型完成:我们完成了五个原型,基本实现了飞机飞行、滚动…...
C语言高频面试题——指针数组和数组指针
指针数组和数组指针是 C/C 中容易混淆的两个概念,以下是详细对比: 1. 指针数组(Array of Pointers) 定义:一个数组,其元素是 指针类型。语法:type* arr[元素个数]; 例如:int* ptr_a…...
爱普生TG-5006CG成为提升5G RedCap时钟同步精度的理想选择
在 5G 通信技术持续演进的进程中,5G RedCap(Reduced Capability,即降低能力)是5G技术中针对物联网场景优化的一种轻量化标准。它通过降低终端带宽、简化天线配置和调制方式等手段,大幅降低了终端设备的成本和功耗,同时继承了5G NR…...
用Mac M4构建多架构Docker镜像指南
使用Mac M4构建多架构Docker镜像指南 解决问题:WARNING: The requested image‘s platform (linux/amd64) does not match the detected host platform 📌 重点:为什么需要双栈架构镜像? 双栈架构镜像(同时支持ARM64和…...
PCB原理图解析(炸鸡派为例)
晶振 这是外部晶振的原理图。 32.768kHz 的晶振,常用于实时时钟(RTC)电路,因为它的频率恰好是一天的分数(32768 秒),便于实现秒计数。 C25 和 C24:两个 12pF 的电容,用于…...
GPU高效利用率实战揭秘:蓝耘元生代VS传统云平台的降维打击
文章目录 一、前言:AI算力革命与蓝耘元生代的崛起二、蓝耘元生代智算云核心架构解析2.1 技术基石:Kubernetes原生云与蜂巢式资源网络关键创新点: 2.2 核心功能模块 三、蓝耘元生代快速入门指南3.1 注册与资源申请3.2 实战案例:部署…...
EXCEL学习
一、基本计算 求和 SUM(区域):计算区域内数值总和。示例:SUM(A1:A10) 计算A1到A10的和。 平均值 AVERAGE(区域):计算区域内数值的平均值。示例:AVERAGE(B1:B10) 计算B1到B10的平均值。 计数 COUNT(区域):统计区域内非…...
PyTorch 线性回归详解:模型定义、保存、加载与网络结构
目录 前言一、pytorch框架线性回归1.1 pytorch模型的定义1.2 nn.Sequential()1.2.1 nn.Linear1.2.2 nn.Sequential 1.3 nn.ModuleList()1.4 nn.ModuleDict()1.5 nn.Module二、pytorch模型的保存2.1 保存模型的权重和其他参数2.1.1 torch.save()保存字典总结 前言 书接上文 自…...
基础服务系列-Jupyter Notebook 支持JavaScript
IJavascript is a Javascript kernel for the Jupyter notebook. npm install npm i -g ijavascript 报以上错误,执行以下命令。 npm i -g ijavascript --unsafe-perm 说明:npm会有生命周期,某个包会有生命周期来执行一些东西,…...
LabVIEW数据采集与传感系统
开发了一个基于LabVIEW的智能数据采集系统,该系统主要通过单片机与LabVIEW软件协同工作,实现对多通道低频传感器信号的有效采集、处理与显示。系统的设计旨在提高数据采集的准确性和效率,适用于各种需要高精度和低成本解决方案的工业场合。 项…...
如何编写单元测试
一.如何编写单元测试 下面我们以 fetchEnv 方法作为案例,编写一套完整的单元测试用例供读者参考 编写 fetchEnv 方法 ./src/utils/fetchEnv.ts 文件 /*** 环境参数枚举*/enum IEnvEnum {DEV dev, // 开发TEST test, // 测试PRE pre, // 预发PROD prod, // 生…...
【网络编程】从零开始彻底了解网络编程(三)
本篇博客给大家带来的是网络编程的知识点. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便进步 TCP流…...
华为OD机试真题——数据分类(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录全流程解析/备考攻略/经验…...
3步拆解Linux内核源码的思维模型
3步拆解Linux内核源码的思维模型 ——从“不敢碰”到“庖丁解牛” 一、第一步:资料收集与框架搭建——像拼图一样找到“地图” 初看Linux内核源码的人,往往会被其千万行代码淹没。但正如登山前需要地形图,阅读内核前必须构建认知框架。 1…...
图像预处理-图像轮廓特征查找
其实就是外接轮廓,有了轮廓点就可以找到最上、最下、最左、最右的四个坐标(因为有xmin,xmax,ymin,ymax)。就可以绘制出矩形。 一.外接矩形 cv.boundingRect(轮廓点) - 返回x,y,w,h,传入一个轮廓的轮廓点,若有多个轮廓需…...
布尔差分法解析:从逻辑导数到电路优化
#布尔差分法解析:从逻辑导数到电路优化 一、背景数学知识:布尔代数基础 布尔变量与函数 在布尔代数中,变量的取值只有 0(表示假)和 1(表示真)。例如,一个布尔变量 x 可以取 0 或 1。…...
【NVIDIA】Isaac Sim 4.5.0 加载 Franka 机械臂
目录 一、NVIDIA Isaac Sim 4.5.0二、Isaac Sim 4.5.0 核心特性解析1. 基于 Omniverse 的跨平台仿真框架2. 模块化机器人开发架构3. 面向AI的强化学习支持 三、Isaac Sim 4.5.0 仿真环境搭建四、加载 Franka 机械臂1. Python源码2. 代码解析(按执行流程)…...
边缘计算场景下的GPU虚拟化实践(基于vGPU的QoS保障与算力隔离方案)
在智慧交通、工业质检等边缘计算场景中,GPU虚拟化技术面临严苛的实时性与资源隔离挑战。本文基于NVIDIA vGPU与国产算力池化方案,深入探讨多租户环境下算力隔离的工程实践,并给出可复用的优化策略。 一、边缘GPU虚拟化的核心痛点 动态负载…...
使用go-git同步文件到gitee
go-git是golang上纯go实现的git客户端,可用来同步文件到git仓库。 为什么不用gitee官方openapi,因为我需要强制推送覆盖,官方api不支持。 下面是一个通过xml.gz文件到gitee的代码示例 package clientimport ("fmt""gin-epg…...
HTTP 和 HTTPS 有什么区别?
文章目录 安全性端口号连接方式证书性能搜索引擎优化(SEO) HTTP(Hypertext Transfer Protocol,超文本传输协议)和 HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议)都…...
【C++软件实战问题排查经验分享】UI界面卡顿 | CPU占用高 | GDI对象泄漏 | 线程堵塞 系列问题排查总结
目录 1、UI界面卡顿问题排查 2、软件CPU占用高问题排查 3、UI界面显示异常(GDI对象泄漏导致窗口绘制异常)问题排查 4、软件线程堵塞(包含线程死锁)问题排查 5、最后 C软件异常排查从入门到精通系列教程(核心精品专…...
ADB->查看某个应用的版本信息
查看某个应用版本的版本 在Android开发和测试过程中,我们经常需要获取应用的版本信息。本文将详细介绍如何使用ADB命令来查询特定应用(以com.example.myapplication为例)的版本号。 基本命令 要获取com.example.myapplication应用的版本名…...
Selenium的ActionChains:自动化Web交互的强大工具
目录 ActionChains简介环境准备基础操作鼠标操作键盘操作拖放操作高级用法常见问题与解决方案最佳实践总结 ActionChains简介 ActionChains是Selenium WebDriver提供的一个用于执行复杂用户交互的工具类。它允许我们模拟鼠标移动、点击、拖放以及键盘输入等操作,…...
管道位移自动化监测方案
一、背景 管道系统在区域性地质沉降作用下易形成非均匀应力场集中现象,诱发管体屈曲变形及环焊缝界面剥离等连续损伤累积效应,进而导致管道力学性能退化与临界承载能力衰减。传统人工巡检受限于空间覆盖度不足及数据采集周期长(≥72h…...
CompletableFuture并行处理任务
CompletableFuture并行处理任务 CompletableFuture基本概念与特性创建CompletableFuture实例 任务编排方法线程池选择默认线程池自定义线程池线程池配置建议 代码示例同步代码 CompletableFuture 基本概念与特性 异步执行: CompletableFuture允许任务在后台线程中…...
【系统架构设计师】信息安全的概念
目录 1. 5个基本要素2. 范围2.1 设备安全2.2 数据安全2.3 内容安全2.4 行为安全 3. 例题3.1 例题1 1. 5个基本要素 1.信息安全包括5个基本要素:机密性、完整性、可用性、可控性与可审查性。2.机密性:确保信息不暴露给未授权的实体或进程。3.完整性:只有得到允许的人才能修改数…...