SpringBoot手动注册定时任务
一、背景
项目存在这样一个场景。程序启动过程中,在Spring的Bean组件注册完毕后,会初始化一些基础数据到数据库中,而项目中有部分定时任务需要依赖这些基础数据才能正常运行。如果直接使用@Scheduled注解标注定时任务方法,会导致定时任务提前执行且执行失败。
基于以上背景,需要将定时任务的注册执行放在数据初始化以后,那么这部分定时任务就需要手动注册且与基础数据初始化操作保持同步执行,保证定时任务的执行一定晚于数据初始化。
二、方案
自定义配置一个定时任务注册器和定时任务执行器,用于处理我们的需求场景。
三、编码实现
通过阅读Spring实现的定时任务源码(篇幅有限,不展开),得知其底层使用的执行器org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
,使用方法org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler#schedule(java.lang.Runnable, org.springframework.scheduling.Trigger)
来配置启动定时任务。
因此,我们也使用这个类来启动需要控制执行时机的定时任务,实现代码如下:
package com.jacks.task;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;/*** 配置自定义定时任务执行器** @author Jacks丶* @since 2025-03-16*/
@Configuration
@Slf4j
public class ScheduledConfig implements SchedulingConfigurer {private TaskScheduler scheduler;/*** 配置定时任务注册器,注册器中自定义执行器用于手动执行定时任务** @param taskRegistrar the registrar to be configured*/@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {scheduler = buildScheduler();taskRegistrar.setScheduler(scheduler);}/*** 自定义定时任务执行器,用于执行定时任务** @return 定时任务执行器对象*/@Beanpublic TaskScheduler buildScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setThreadNamePrefix("thread-task-t-");scheduler.setPoolSize(2);return scheduler;}/*** 初始化定时任务,提供给其他Bean对象手动注册定时任务*/public void initScheduledTask() {scheduler.schedule(() -> System.out.println("定时任务执行了..."), new CronTrigger("*/2 * * * * *"));}
}
此时我们的初始化数据的逻辑如下:
package com.jacks.task;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;import java.time.Duration;/*** SpringBoot启动阶段执行** @author Jacks丶* @since 2025-03-16*/
@Slf4j
public class SpringTask implements SpringApplicationRunListener {public SpringTask(SpringApplication application, String[] args) {log.info("hello init SpringTask.");}/*** Springboot应用已就绪,可在此初始化基础数据** @param context 上下文对象,包含Bean对象,可用于获取定时任务配置Bean,然后调用init方法* @param timeTaken 应用准备所花费时间,可用于了解性能*/@Overridepublic void ready(ConfigurableApplicationContext context, Duration timeTaken) {log.info("开始初始化 ....");try {// 模拟数据初始化耗时Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("结束初始化 ...");// 获取定时任务配置类bean对象执行初始化方法启动定时任务context.getBean(ScheduledConfig.class).initScheduledTask();}
}
启动类如下:
package com.jacks;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;/*** 启动入口类** @author Jacks丶* @since 2025-03-16*/
@EnableScheduling
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
此时可见控制台输出:
2025-03-16 18:43:10.489 INFO 17176 --- [ main] com.jacks.DemoApplication : Started DemoApplication in 0.88 seconds (JVM running for 1.185)
2025-03-16 18:43:10.490 INFO 17176 --- [ main] com.jacks.task.SpringTask : 开始初始化 ....
2025-03-16 18:43:12.503 INFO 17176 --- [ main] com.jacks.task.SpringTask : 结束初始化 ...
2025-03-16 18:43:14.006 INFO 17176 --- [thread-task-t-1] com.jacks.task.ScheduledConfig : 定时任务执行了...
2025-03-16 18:43:16.001 INFO 17176 --- [thread-task-t-1] com.jacks.task.ScheduledConfig : 定时任务执行了...
2025-03-16 18:43:18.014 INFO 17176 --- [thread-task-t-1] com.jacks.task.ScheduledConfig : 定时任务执行了...
四、代码优化
如何优雅的将以上逻辑写入到项目中呢?那就需要引入依赖倒置、单一职责等思想。以上代码中,定时任务是直接定义在initScheduledTask
方法中的,当我们需要添加定时任务时,那么就会侵入式的修改com.jacks.task.ScheduledConfig#initScheduledTask
。
基于单一职责思想,定时任务配置类就只负责初始化注册器、执行器和启动定时任务就好,定时任务的定义逻辑就需要提取出去。
基于依赖倒置的思想,我们需要将注册时依赖的具体实现类优化成接口,所以需要抽取接口,让注册依赖接口,而不是具体实现,我们在新增定时任务时,只需要继承接口编写定时任务逻辑即可,无需侵入式的修改原逻辑。
1、定义接口获取定时任务
package com.jacks.service;import org.springframework.scheduling.config.CronTask;import java.util.List;/*** 定时任务接口,用于提供可执行的定时任务对象** @author Jacks丶* @since 2025-03-16*/
public interface IScheduled {/*** 提供定时任务执行对象** @return 定时任务执行对象列表*/List<CronTask> getScheduledTasks();
}
2、在实现类定义定时任务逻辑
package com.jacks.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.config.CronTask;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;/*** 定时任务方法** @author Jacks丶* @since 2025-03-16*/
@Slf4j
@Service
public class MyService implements IScheduled {/*** 定时任务逻辑*/public void task() {log.info("task1 exec..");}/*** 提供定时任务执行对象,用于初始化注册** @return 定时任务列表*/@Overridepublic List<CronTask> getScheduledTasks() {List<CronTask> cronTasks = new ArrayList<>();cronTasks.add(new CronTask(this::task, "*/2 * * * * *"));return cronTasks;}
}
3、单一职责,定时任务抽取为方法入参
package com.jacks.task;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;import java.util.List;/*** 配置自定义定时任务执行器** @author Jacks丶* @since 2025-03-16*/
@Configuration
@Slf4j
public class ScheduledConfig implements SchedulingConfigurer {private TaskScheduler scheduler;/*** 配置定时任务注册器,注册器中自定义执行器用于手动执行定时任务** @param taskRegistrar the registrar to be configured*/@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {scheduler = buildScheduler();taskRegistrar.setScheduler(scheduler);}/*** 自定义定时任务执行器,用于执行定时任务** @return 定时任务执行器对象*/@Beanpublic TaskScheduler buildScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setThreadNamePrefix("thread-task-t-");scheduler.setPoolSize(2);return scheduler;}/*** 初始化定时任务,提供给其他Bean对象手动注册定时任务** @param cronTasks 待执行的定时任务列表*/public void initScheduledTask(List<CronTask> cronTasks) {cronTasks.forEach(task -> scheduler.schedule(task.getRunnable(), task.getTrigger()));}
}
4、依赖倒置,注册时依赖接口,而不是具体实现
注册定时任务时获取所有com.jacks.service.IScheduled
的实现类,并调用getScheduledTasks
方法获取定时任务。
package com.jacks.task;import com.jacks.service.IScheduled;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.config.CronTask;import java.time.Duration;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;/*** SpringBoot启动阶段执行** @author Jacks丶* @since 2025-03-16*/
@Slf4j
public class SpringTask implements SpringApplicationRunListener {public SpringTask(SpringApplication application, String[] args) {log.info("hello init SpringTask.");}/*** Springboot应用已就绪,可在此初始化基础数据** @param context 上下文对象,包含Bean对象,可用于获取定时任务配置Bean,然后调用init方法* @param timeTaken 应用准备所花费时间,可用于了解性能*/@Overridepublic void ready(ConfigurableApplicationContext context, Duration timeTaken) {log.info("开始初始化 ....");try {// 模拟数据初始化耗时Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("结束初始化 ...");// 获取定时任务配置类bean对象执行初始化方法启动定时任务Collection<IScheduled> scheduledServiceList = context.getBeansOfType(IScheduled.class).values();List<CronTask> cronTasks = scheduledServiceList.stream().flatMap(service -> service.getScheduledTasks().stream()).collect(Collectors.toList());context.getBean(ScheduledConfig.class).initScheduledTask(cronTasks);}
}
五、结语
以上就是手动控制注册定时任务时机的一种实现方案,并且这种方案不会影响@Scheduled
注解注册的定时任务。
希望本篇博客对你有所帮助。
相关文章:
SpringBoot手动注册定时任务
一、背景 项目存在这样一个场景。程序启动过程中,在Spring的Bean组件注册完毕后,会初始化一些基础数据到数据库中,而项目中有部分定时任务需要依赖这些基础数据才能正常运行。如果直接使用Scheduled注解标注定时任务方法,会导致定…...
通过 Python 爬虫提高股票选股胜率
此贴为Python爬虫技术学习贴 在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则,第一套弱约束,第…...
InternVL:论文阅读 -- 多模态大模型(视觉语言模型)
更多内容:XiaoJ的知识星球 文章目录 InternVL: 扩展视觉基础模型与通用视觉语言任务对齐1.概述2.InternVL整体架构1)大型视觉编码器:InternViT-6B2)语言中间件:QLLaMA。3)训练策略(1)…...
代码随想录算法训练营第三十五天(20250303) |01背包问题 二维,01背包问题 一维,416. 分割等和子集 -[补卡20250316]
01背包问题 二维 链接 遍历物品没有大小顺序要求重点是模拟,推导出递推公式 #include <iostream> #include <vector>int main(){int m, n;std::cin>>m>>n;std::vector<int> weight(m,0),value(m,0);for(int i{0}; i<m; i){std:…...
RGV调度算法(三)--遗传算法
1、基于时间窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校数学建模挑战赛B题 2019-mathorcupB题-环形穿梭机调度模型&a…...
并发编程-
一、简述 线程:线程是cpu可执行的最小单位,而进程是操作系统可分配的最小资源单位。一个进程中可以有多个线程。 线程的五个状态: 新建(new Thread()) 就绪 (thread.start()) 运行(…...
Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node
Mac中使用 nvm 管理 node 版本,在使用指令:nvm use XXX 切换版本之后。 关闭终端,再次打开,输入 node -v 还是得到之前的 node 版本。 原因: 在这里这个 default 中有个 node 的版本号,使用 nvm use 时&a…...
C语言(25)
一.数据在内存中的存储 1.整数在内存中的存储 整数在内存中以二进制的形式储存,分别为原码,补码,反码 有符号的整数,在上述三种形式都有符号位和数值位两个部分,符号位为0是正数,1是负数,最高…...
HTML、CSS
什么是HTML、CSS HTML结构标签及特点 CSS引入方式 CSS颜色表示形式: CSS引入方式、颜色表示、颜色属性 CSS选择器 超链接...
c#:主窗体与子控件之间的数据传递:基于事件和委托的实现
1. 概述 在WPF中,主窗体与子控件之间的数据传递通常通过以下两种方式实现: 事件(Event):主窗体触发事件,子控件订阅事件并接收数据。 委托(Delegate):通过委托将子控件…...
Dynamics 365 启用用户安全角色变更的审核功能
D365自身的审核功能这里就不说了,是一个很古老的功能,用过D365的人应该都知道,今天要说的是用户安全角色变更的审核记录。 很多人用系统的审核功能,更多的是用来追踪用户的登录记录,或者记录的修改记录。 而实际的项目…...
MyBatis注解
MyBatis 的注解(Annotations)提供了一种简洁的方式来配置 SQL 映射,而无需使用 XML 文件。通过在 Mapper 接口的方法上使用注解,可以直接在 Java 代码中定义 SQL 语句和相关映射。这种方式使得代码更加集中和易于维护,…...
1.Windows+vscode+cline+MCP配置
文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…...
94.HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils 文章目录 HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils1. 动画系…...
Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)
一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库,特别适合处理表格类数 据。它建立在NumPy数组之上,提供了高效的数据结构和数据分析工具,使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…...
设计模式之原型模式:原理、实现与应用
引言 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。原型模式特别适用于创建成本较高的对象,或者需要动态配置的对象。本文将深入探讨原型模式的原理、实现方…...
平方矩阵问题
Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…...
C语言之链表
文章目录 前言 一、链表基本概念 1、声明节点结构 2、创建节点变量 3、链表所有节点 4、遍历链表 二、add添加 三、insert插入 四、remove删除 五、查找 总结 前言 链表是一种重要的数据结构,用于存储和组织数据。它是由一系列节点组成的数据结构&#x…...
RabbitMQ延迟消息
文章目录 延迟消息死信交换机延迟消息延迟消息应用场景 延迟消息 生产者在发送消息的时候指定一个时间,消费者不会立即收到该消息,而是在指定时间之后才收到消息,这就是延迟消息。 比如说这么一个场景,用户下单后将商品库存进行…...
Unity中WolrdSpace下的UI展示在上层
一、问题描述 Unity 中 Canvas使用World Space布局的UI,想让它不被3d物体遮挡,始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试(ZTest),强制 UI 始终渲染在最上层。 Shader "Custo…...
【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析
【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析 算法算法分析正确性算法完成需要的时间使用的存储空间简单性渐进分析递归分析主方法求解递归式递归树求解代入法概率分析和随机算法顺序统计量算法 什么是算法?算法(Algorithm)是指解题方案的准确而完整…...
【菜鸟飞】Conda安装部署与vscode的结合使用
介绍 Conda 是一个跨平台的开源工具,用于管理软件包和环境。最初由 Anaconda 公司开发,它的设计目标是支持数据科学和机器学习领域,但其功能不仅局限于此。 以下是 Conda 的核心特点: 包管理:安装、更新、卸载各种库…...
LeetCode2593 标记所有元素后数组的分数
贪心算法实战:数组标记与分数计算(LeetCode 同类题解析) 一、问题描述 给定一个正整数数组 nums,按以下规则计算最终分数: 初始分数 score 0每次选择最小且未被标记的元素(值相同选下标最小)…...
【C++多线程】thread
C中的std::thread是C11引入的线程库的一部分,提供了创建和管理线程的能力。它封装了操作系统的线程接口,使得在C中更方便地进行多线程编程。 1. std::thread 的定义 std::thread 类位于<thread>头文件中,定义在std命名空间下ÿ…...
补充二分LIS
B3637 最长上升子序列 题目描述 这是一个简单的动规板子题。 给出一个由 n ( n ≤ 5000 ) n(n\le 5000) n(n≤5000) 个不超过 1 0 6 10^6 106 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。 最长上升子序列是指,从原序列中按顺序取出一些数字排…...
airtest用法
安装python3.7.9 64 python3 -m pip install -U airtest 或者: git clone https://github.com/AirtestProject/Airtest.git pip install -e airtest 下载adb 可以开始无界面的airtest 下载AirtestIDE 安装与启动 - Airtest Project Docs Airtest Project...
30天学习Java第四天——设计模式
设计模式概述 设计模式是一套被广泛接受的、经过试验的、可反复使用的基于面向对象的软件设计经验总结,它是开发人员在软件设计时,对常见问题的解决方案的总结和抽象。 一句话就是,设计模式是针对软件开发中常见问题和模式的通用解决方案。 …...
MongoDB 和 Elasticsearch的区别、优缺点对比,以及选型建议
MongoDB 和 Elasticsearch 在存储和搜索方面各有特点,适用于不同的场景。以下是它们的区别、优缺点对比,以及选型建议。 1. 概述 MongoDB:分布式 NoSQL 文档数据库,基于 BSON(类似 JSON)的文档存储&#x…...
在Android中,子线程可以更新UI吗
目录 为什么子线程不能直接更新UI? 如何正确在子线程更新UI? 1. 使用runOnUiThread方法 2. 通过Handler发送消息到主线程 3. 使用View.post(Runnable)方法 4. 结合AsyncTask(已过时,仅作了解) 5. 使用Kotlin协程…...
unittest vs pytest区别
unittest vs pytest 对比 unittest 像“手动挡汽车”:操作步骤多,规则严格,适合老司机。pytest 像“自动挡汽车”:开起来轻松,功能强大,适合新手和高效开发。 区别点unittest(你学过的&…...
OpenAI与谷歌DeepMind新品同日竞技,谁能引领机器人现实任务新潮流?
2025年3月12日,科技巨头谷歌DeepMind与OpenAI均发布了与机器人执行现实任务相关的新产品:谷歌DeepMind的新AI模型、OpenAI的Agents工具集,二者在技术路径、应用场景、安全机制设计等方面存在明显差异,其发展态势备受行业关注。 …...
JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal
并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…...
特殊 IP 地址
文章目录 特殊IP地址概述受限广播地址(Limited Broadcast Address)直接广播地址(Directed Broadcast Address)多播地址(Multicast Address)环回地址(Loopback Address)本网络本主机&…...
SSL/TLS 1.2过程:Client端如何验证服务端证书?
快速回顾非对称加密和对称加密 首先快速说一下非对称加密和对称加密。非对称加密,就是有一个公钥和私钥(成对存在)。 公钥对一段文本A加密得到文本B,只有对应的私钥能对B解密得到A。 私钥对一段文本C加密得到文本D,只有对应的公钥能对D解密得…...
Android(java)高版本 DownloadManager 封装工具类,支持 APK 断点续传与自动安装
主要有以下优点 兼容高版本 Android:适配 Android 10 及以上版本的存储权限和安装权限。断点续传:支持从断点继续下载。下载进度监听:实时获取下载进度并回调。错误处理:处理下载失败、网络异常等情况。自动安装 APK:…...
基于three.js的虚拟人阴影渲染优化方案
作者:来自 vivo 互联网大前端团队- Su Ning 本文将探讨 three.js 中的阴影渲染机制,并分享一些针对性能和效果优化的实用技巧,帮助开发者在不同场景下做出最佳的权衡选择。 一、前言 在3D网页应用中,高质量的阴影渲染对于营造场…...
人工智能中神经网络是如何进行预测的
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 文章目录 引言神经网络的基本结构神经网络的前向传播前向传播的步骤激活函数 代码实现流程图详细解释…...
vue3 中使用 Recorder 实现录音并上传,并用Go语言调取讯飞识别录音(Go语言)
录音并识别 效果图一、开启游览器录音权限二、前端代码三、Go代码,上传到讯飞识别录音返回到前端 效果图 recorder-core插件可以在网页中进行录音。录音文件(blob)并可以自定义上传,可以下载录音文件到本地,本文录音过程中会显示可视化波形,插件兼容PC端…...
自探索大语言模型微调(一)
一、数据 1.1、失败案例 Hugging Face: 根据B站上搜索到的资料,datasets这个库可以直接下载丰富的数据集合和与训练模型,调用也非常的简单,唯一的缺点就是,需要外网(翻墙),用国内的…...
算法练习(链表)
链表 链表的分类 单向链表,双向链表带头链表,不带头链表循环的,非循环的 链表的结构 图中所示的为链表的一个节点,value是这个节点的所存储的数据值,next为下一节点的地址。 代码实现链表 1.创建节点类 节点由…...
在 Ubuntu 服务器上使用宝塔面板搭建博客
📌 介绍 在本教程中,我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板,并使用 Nginx PHP MySQL 搭建一个博客(如 WordPress)。 主要步骤包括: 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…...
K8S学习之基础二十八:k8s中的configMap
k8s中的configMap configMap是k8s的资源对象,简称cm,用于保存非机密性的配置,数据可以用key/value键值对形式保存,也可以通过文件形式保存 在部署服务的时候,每个服务都有自己的配置文件,如果一台服…...
EDID读取学习
简介 Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件…...
基于 SSE 和 WebSocket 的在线文本实时传输工具
简介 在线文本实时传输工具支持 SSE(Server-Sent Events) 和 WebSocket,可在不同设备间快速共享和同步文本,适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步:文本输入后,另一端用户可立即看到…...
大语言模型安全风险分析及相关解决方案
大语言模型的安全风险可以从多个维度进行分类。 从输入输出的角度来看,存在提示注入、不安全输出处理、恶意内容生成和幻觉错误等风险; 从数据层面来看,训练数据中毒、敏感信息泄露和模型反演攻击是主要威胁; 模型自身则面临拒绝服务和盗窃的风险; 供应链和插件的不安全引…...
4、linux c 进程
【三】进程 1. 进程与程序的区别 程序:存放在磁盘上的指令和数据的有序集合(文件),是静态的。 进程:执行一个程序所分配的资源的总称,是动态的。 2. 进程的组成部分 BSS段(bss)&…...
OpenFeign
OpenFeign 工作原理详解 1. 声明式接口 开发者通过定义一个接口,并使用特定的注解(如GetMapping, PostMapping等)来描述HTTP请求。OpenFeign会根据这些注解自动生成相应的HTTP请求。 注解支持: FeignClient:用于定…...
Centos离线安装perl
文章目录 Centos离线安装perl1. perl是什么?2. Perl下载地址3. perl的安装4. 安装结果验证 Centos离线安装perl 1. perl是什么? Perl 是一种 高级脚本语言,诞生于 1987 年,以强大的 文本处理能力 和灵活性著称,常用于…...
RabbitMQ可靠性进制
文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动,可能…...
PHP优化技术
最近在学习php语言,打算用来提升开发小项目的效率。下面是php项目中常见的优化手段。 1、引起php性能问题的原因 (1)php语法使用不当 (2)使用php做了它不擅长的事 (3)用php连接的服务不给力 &…...