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

定时任务框架

常用定时任务框架

  1. JDK 自带的 ScheduledExecutorService

    • 适用于轻量级定时任务,基于线程池实现。
    • API 简单,适用于小规模任务调度。
  2. Quartz

    • 强大的 Java 任务调度框架,支持 Cron 表达式、分布式集群、持久化等。
    • 适用于复杂调度场景,如动态任务管理、任务持久化等。
  3. Spring Task

    • Spring 提供的轻量级定时任务方案,支持 @Scheduled 注解,简洁易用。
    • 适用于简单的定时任务,不支持集群和分布式调度。
  4. XXL-JOB

    • 轻量级分布式任务调度框架,支持集群、动态管理任务、任务日志、失败重试等功能。
    • 适用于互联网企业的大规模定时任务场景。
  5. Elastic-Job

    • 基于 Zookeeper 的分布式任务调度框架,支持分片、失效转移、任务高可用等特性。
    • 适用于大规模分布式任务调度,如电商、金融等业务场景。
  6. PowerJob

    • 基于 Spring Boot 开发的分布式任务调度框架,支持分布式、秒级调度、任务依赖等功能。
    • 适用于现代分布式任务管理,支持 Web 可视化管理。

大数据相关

  1. Azkaban

    • 由 LinkedIn 开源的批处理任务调度系统,适用于大数据任务调度。
    • 主要用于 Hadoop 任务的调度,支持 DAG 依赖关系管理。
  2. Airflow

    • Apache 旗下的工作流调度系统,支持 Python 任务编排,DAG 任务依赖管理。
    • 适用于数据工程、机器学习等复杂任务调度。
  3. Oozie

    • Hadoop 生态中的工作流调度系统,主要用于 Hadoop 任务调度。
    • 适用于大数据 ETL 任务管理。

运维 & DevOps

  1. Kubernetes CronJob

    • 适用于 Kubernetes 集群环境的定时任务,支持容器化任务调度。
    • 适用于微服务架构下的定时任务。
  2. Crontab(Linux 自带)

    • 适用于简单的系统级定时任务调度,如 Shell 脚本、数据同步等。

选择建议

  • 轻量级Spring Task / ScheduledExecutorService
  • 单机复杂调度Quartz
  • 分布式调度XXL-JOB / Elastic-Job / PowerJob
  • 大数据任务调度Airflow / Azkaban / Oozie
  • K8s 云原生Kubernetes CronJob

分布式定时任务框架

如果你的项目被 多个相同实例的 Pod 复制 并部署在 Kubernetes 集群中,那么使用普通的 @ScheduledScheduledExecutorService 就会导致 每个 Pod 都会执行同一个定时任务,可能会产生 重复任务执行 的问题。为了解决这个问题,你可以选择 支持分布式调度 的定时任务框架,主要有以下几种推荐方案:

1. Elastic-Job(推荐)

  • 适用场景:适用于 微服务架构,可基于 Zookeeper 进行任务分片,实现分布式调度。
  • 特点
    • 分片执行:不同 Pod 执行任务的不同部分,避免重复执行。
    • 任务失效转移:某个 Pod 宕机后,任务会自动转移给其他 Pod 继续执行。
    • 支持高可用:基于 Zookeeper 进行任务协调,防止重复执行。
  • 适用于
    • 高并发业务,如订单对账、数据同步、日志清理等。
    • 需要保证每个任务只执行一次,或按分片方式执行的场景

2. XXL-JOB

  • 适用场景:适用于 Spring Boot + 集群环境,提供一个 调度中心 统一管理任务,避免重复执行。
  • 特点
    • 基于调度中心(Admin)统一管理定时任务。
    • 任务分片:可配置多个 Pod 执行不同的任务片段,防止重复执行。
    • 失败重试:任务失败后可自动重试。
    • 可视化管理:Web 界面配置任务,支持动态修改。
  • 适用于
    • 需要 Web 可视化管理任务的场景
    • 希望任务分布式执行,并能动态调整任务执行策略

3. PowerJob

  • 适用场景:适用于 现代云原生架构,支持 秒级任务调度、分布式任务执行
  • 特点
    • 支持 Standalone、Worker、Server 三种模式
    • 多种执行模式:单机、广播、MR、MapReduce 等。
    • 动态扩展:Worker 增加时自动均衡任务负载。
    • 可视化管理:类似 XXL-JOB,可动态修改任务配置。
  • 适用于
    • 云原生环境(Kubernetes 部署),任务需要动态扩缩容。
    • 需要支持复杂任务依赖的调度场景

4. Kubernetes CronJob(适用于简单定时任务)

  • 适用场景:适用于 Kubernetes 环境,需要 周期性执行的任务,如:
    • 订单定期清理
    • 数据库备份
    • 日志归档
  • 特点
    • K8s 原生支持,直接通过 CronJob 配置调度任务。
    • 任务隔离:每次任务都会创建一个新的 Pod,适合一次性任务。
    • 无法做任务分片,不适用于高并发、复杂任务调度。
  • 适用于
    • 简单的、无需分片的定时任务(比如每天凌晨执行数据备份)。
    • 无需对任务执行状态进行复杂管理的场景

5. Quartz + DB 锁(适用于持久化任务调度)

  • 适用场景:如果你的任务需要存储到数据库,并且希望 只有一个实例 触发定时任务。
  • 方法
    • Quartz 任务存储到 数据库(JDBC Store)
    • 任务执行前 数据库加锁,保证任务不会被多个 Pod 并发执行。
  • 适用于
    • 需要保证任务持久化,并防止重复执行
    • 不想引入 Zookeeper、调度中心等额外依赖的情况下

推荐方案

方案适用场景任务去重分布式支持备注
Elastic-Job高并发、任务分片、任务转移✅ 基于 Zookeeper适用于微服务和任务均衡
XXL-JOB大规模分布式任务调度✅ 统一调度中心适用于企业级任务管理
PowerJob云原生 + 任务编排✅ 支持 MapReduce适用于复杂任务调度
K8s CronJob简单定时任务适用于周期性任务,如数据清理
Quartz + DB 锁持久化任务调度适用于小规模任务,防止重复

最终选择

如果你的 定时任务是分布式环境下的关键任务
推荐 Elastic-JobXXL-JOB,避免重复执行,并支持任务分片。

如果你的 定时任务是云原生环境
推荐 PowerJob,可以动态扩缩容,适配 Kubernetes。

如果你的 定时任务是单一周期性任务
推荐 Kubernetes CronJob,原生支持,简单好用。

如果你的 定时任务需要持久化,并防止重复执行
推荐 Quartz + DB 锁,适用于少量任务的环境。

Elastic-Job 示例代码

下面是 Elastic-Job 在分布式集群环境下的完整示例代码,基于 Spring Boot + Zookeeper,实现了 分布式定时任务调度

功能概述

  • 采用 Spring Boot + Elastic-Job-Lite 实现分布式定时任务。
  • 任务注册到 Zookeeper,保证 多个实例(Pod)不会重复执行同一任务,可实现 任务分片
  • 适用于 Kubernetes、Docker Swarm普通分布式集群环境

1. 引入依赖

pom.xml 中添加 Elastic-Job 相关依赖:

<dependencies><!-- Elastic-Job 核心 --><dependency><groupId>org.apache.shardingsphere.elasticjob</groupId><artifactId>elasticjob-lite-spring-boot-starter</artifactId><version>3.0.2</version></dependency><!-- Zookeeper 客户端 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.5.0</version></dependency><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

2. 配置 Zookeeper

application.yml 中配置 Elastic-Job 连接 Zookeeper

spring:application:name: elastic-job-demoelasticjob:reg-center:server-lists: zk-host:2181  # 替换为你的 Zookeeper 地址namespace: elastic-job-demo  # 在 Zookeeper 创建的命名空间jobs:demoJob:cron: "0/10 * * * * ?"  # 每 10 秒执行一次sharding-total-count: 3  # 任务分片总数,多个实例共同执行任务overwrite: true  # 是否覆盖旧任务

3. 编写定时任务

新建 分片任务,继承 SimpleJob,实现 execute() 方法:

import org.apache.shardingsphere.elasticjob.api.ShardingContext;
import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob;
import org.springframework.stereotype.Component;@Component
public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {// 获取当前分片编号int shardingItem = shardingContext.getShardingItem();String jobName = shardingContext.getJobName();// 模拟不同分片处理不同数据switch (shardingItem) {case 0:System.out.println("【分片 0】执行任务:" + jobName);break;case 1:System.out.println("【分片 1】执行任务:" + jobName);break;case 2:System.out.println("【分片 2】执行任务:" + jobName);break;default:System.out.println("【未知分片】执行任务:" + jobName);}}
}

4. 注册任务

创建 ElasticJobConfig,将任务注册到 ElasticJob

import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.OneOffJobBootstrap;
import org.apache.shardingsphere.elasticjob.lite.api.listener.ElasticJobListener;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticJobConfig {private final ZookeeperRegistryCenter regCenter;private final MyElasticJob myElasticJob;public ElasticJobConfig(ZookeeperRegistryCenter regCenter, MyElasticJob myElasticJob) {this.regCenter = regCenter;this.myElasticJob = myElasticJob;}@Beanpublic ScheduleJobBootstrap initElasticJob() {JobConfiguration jobConfig = JobConfiguration.newBuilder("myElasticJob", 3).cron("0/10 * * * * ?")  // 每 10 秒执行.overwrite(true)  // 覆盖旧任务.build();return new ScheduleJobBootstrap(regCenter, myElasticJob, jobConfig);}
}

5. 配置 Zookeeper 注册中心

创建 ZookeeperConfig 以连接 Zookeeper

import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperConfiguration;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ZookeeperConfig {@Bean(initMethod = "init")public ZookeeperRegistryCenter regCenter() {return new ZookeeperRegistryCenter(new ZookeeperConfiguration("zk-host:2181", "elastic-job-demo"));}
}

6. 运行多个 Pod 进行集群测试

方式 1:本地多个实例

分别启动多个 Spring Boot 实例:

java -jar target/elastic-job-demo.jar --server.port=8081
java -jar target/elastic-job-demo.jar --server.port=8082
java -jar target/elastic-job-demo.jar --server.port=8083

查看日志

  • 任务分片 08081 执行
  • 任务分片 18082 执行
  • 任务分片 28083 执行

方式 2:Kubernetes 部署

编写 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: elastic-job-demo
spec:replicas: 3  # 启动 3 个实例selector:matchLabels:app: elastic-job-demotemplate:metadata:labels:app: elastic-job-demospec:containers:- name: elastic-jobimage: your-docker-repo/elastic-job-demo:latestports:- containerPort: 8080env:- name: ZK_HOSTvalue: "your-zk-cluster:2181"

部署到 Kubernetes:

kubectl apply -f deployment.yaml

7. 任务执行结果

在多个 Pod 中查看日志

kubectl logs -f elastic-job-demo-xxxx

示例输出:

【分片 0】执行任务:myElasticJob
【分片 1】执行任务:myElasticJob
【分片 2】执行任务:myElasticJob

特点:

  • 多个 Pod 共同执行任务,不会重复执行相同的任务
  • 任务会按分片编号进行分配
  • Pod 宕机时,任务会自动迁移到其他 Pod

总结

方案说明
Elastic-Job + Zookeeper适用于 分布式定时任务,确保任务 不重复执行
任务分片多个 Pod 共同执行任务,各自处理不同分片
Kubernetes 兼容适用于微服务架构,支持动态扩缩容

适用场景

  • 分布式数据清理
  • 订单对账
  • 定期同步数据库数据
  • 日志归档

XXL-JOB

下面是 XXL-JOB分布式集群场景下 执行定时任务的完整示例代码,基于 Spring Boot + MySQL 实现。

功能概述

  • 使用 XXL-JOB 框架调度分布式任务,保证 多个实例 不会重复执行同一任务。
  • 配置 JobHandler,任务在集群中分片执行。
  • 使用 MySQL 存储任务执行信息,支持 分布式集群部署,避免任务重复执行。

1. 引入依赖

pom.xml 中添加 XXL-JOBSpring Boot 相关依赖:

<dependencies><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- XXL-JOB --><dependency><groupId>com.xxl.job</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency><!-- Spring Boot Starter for XXL-JOB --><dependency><groupId>com.xxl.job</groupId><artifactId>xxl-job-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- MySQL Driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency>
</dependencies>

2. 配置 XXL-JOB

application.yml 中配置 XXL-JOB 的相关信息:

xxl:job:admin:addresses: http://admin-server:8080/xxl-job-admin  # XXL-JOB Admin 的地址executor:appname: xxl-job-demo    # 执行器应用名称ip: 0.0.0.0             # 允许所有IP访问port: 9999              # 执行器端口logpath: /data/applogs/xxl-job/  # 执行日志路径logretentiondays: 30    # 执行日志保留天数

3. 配置 XXL-JOB Admin

XXL-JOB Admin 需要先进行安装和启动,可以在官网 XXL-JOB GitHub 找到安装步骤。

4. 编写定时任务(JobHandler)

新建一个 JobHandler,继承 XXLJob 并重写 execute() 方法:

import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.handler.IJobHandler;
import org.springframework.stereotype.Component;@JobHandler(value = "demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {@Overridepublic ReturnT<String> execute(String param) throws Exception {// 业务逻辑,比如进行数据清理或定时任务等System.out.println("执行定时任务: " + param);return ReturnT.SUCCESS;}
}

在这里,demoJobHandlerJobHandler 的名字,需要在 XXL-JOB Admin 配置。

5. 配置 XXL-JOB 执行器

创建 XxlJobConfig 配置类,完成 XXL-JOB 执行器的配置:

import com.xxl.job.core.executor.XxlJobExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class XxlJobConfig {@Beanpublic XxlJobExecutor xxlJobExecutor() {XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();xxlJobExecutor.setAdminAddresses("http://admin-server:8080/xxl-job-admin");xxlJobExecutor.setAppname("xxl-job-demo");xxlJobExecutor.setIp("0.0.0.0");xxlJobExecutor.setPort(9999);xxlJobExecutor.setLogPath("/data/applogs/xxl-job/");xxlJobExecutor.setLogRetentionDays(30);return xxlJobExecutor;}
}

6. 配置 XXL-JOB Admin 创建任务

登录 XXL-JOB Admin 后,进行以下配置:

  1. 创建调度器:在 XXL-JOB Admin 中点击 Job Group,创建一个新的 调度器
  2. 添加任务:在 Job 页面中,点击 添加任务,配置任务名、执行器类型(选择 demoJobHandler)、分片信息等。

7. 配置任务分片执行

在 XXL-JOB Admin 中,配置分片策略,例如:

  • 分片总数:3(表示任务将分配给 3 个不同的实例执行)
  • 任务执行器的分片项:XXL-JOB 会自动将任务按分片项分配给不同的执行器实例。

例如,如果有 3 个执行器实例,则会将任务的 3 个分片(0、1、2)分别分配给 3 个实例执行,确保不同的实例执行不同的任务。

8. 启动项目并执行任务

启动 Spring Boot 项目,确保 XXL-JOB Admin 已经部署并且任务已经配置。

  1. 启动 Spring Boot 项目
    mvn spring-boot:run
    
  2. 任务自动执行:项目启动后,XXL-JOB 执行器会自动向 XXL-JOB Admin 注册,并开始执行定时任务。
  3. 查看任务执行日志:可以在 XXL-JOB Admin 中查看任务的执行日志。

9. 扩展功能:动态任务调度

如果需要动态调整任务执行策略(如调整任务的分片数等),可以通过 XXL-JOB Admin 动态调整任务配置。

例如,在 XXL-JOB Admin 中:

  1. 修改任务的 Cron表达式,例如设置成每 30 秒执行一次;
  2. 修改 分片数,如果集群规模扩大,可以修改任务的 分片总数

10. 总结

方案说明
XXL-JOB适用于 分布式任务调度,支持 多实例任务分片执行
任务分片多个实例共同执行任务,避免重复执行任务,确保高可用性
MySQL 存储任务执行信息存储在数据库,支持持久化、任务调度管理
Web UI 管理支持通过 XXL-JOB Admin Web 界面进行任务管理、调度

适用场景

  • 分布式任务调度
  • 定时任务执行
  • 数据同步
  • 日志清理

使用 XXL-JOB 可以在分布式集群中实现高效、可靠的定时任务调度,并且通过 MySQL 存储任务执行状态,确保任务不丢失,执行状态可追踪。

相关文章:

定时任务框架

常用定时任务框架 JDK 自带的 ScheduledExecutorService 适用于轻量级定时任务&#xff0c;基于线程池实现。API 简单&#xff0c;适用于小规模任务调度。 Quartz 强大的 Java 任务调度框架&#xff0c;支持 Cron 表达式、分布式集群、持久化等。适用于复杂调度场景&#xff0…...

ESP32S3读取数字麦克风INMP441的音频数据

ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风&#xff0c;它通过 I2S 接口输出音频数据。在 Arduino 环境中&#xff0c;ESP32S3 的开发通常使用 ESP-IDF&#xff08;Espressif IoT Development Framew…...

利用后缀表达式构造表达式二叉树的方法

后缀表达式&#xff08;逆波兰表达式&#xff09;是一种将运算符放在操作数之后的表达式表示法。利用后缀表达式构造表达式二叉树的方法主要依赖于栈结构。 转换步骤 初始化 创建一个空栈。 遍历后缀表达式 对后缀表达式的每个符号依次处理&#xff1a; 遇到操作数 如果当前符…...

使用express创建服务器保存数据到mysql

创建数据库和表结构 CREATE DATABASE collect;USE collect;CREATE TABLE info (id int(11) NOT NULL AUTO_INCREMENT,create_date bigint(20) DEFAULT NULL COMMENT 时间,type varchar(20) DEFAULT NULL COMMENT 数据分类,text_value text COMMENT 内容,PRIMARY KEY (id) ) EN…...

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”&#xff08;You Only Look Once, YOLO&#xff09;系列的最新版本&#xff0c;于 2025 年 2 月发布。它引入了注意力机制&#xff0c;提升了检测精度&#xff0c;同时保持了高效的实时性能。在保持速度的同时&#xff0c;显著提升了检测精度。例如&am…...

SQLAlchemy系列教程:如何防止SQL注入

SQL注入是一种常见的安全漏洞&#xff0c;它允许攻击者通过应用程序的SQL查询操纵数据库。使用ORM工具&#xff08;如SQLAlchemy&#xff09;提供的内置功能可以帮助减轻这些风险。本教程将指导您完成保护SQLAlchemy查询的实践。 了解SQL注入 当攻击者能够通过用户输入插入或操…...

1. 树莓派上配置机器人环境(具身智能机器人套件)

1. 安装树莓派系统 镜像下载地址&#xff08;windows/Mac/Ubuntu)&#xff0c;安装Pi5. 2. 环境配置&#xff08;登录Pi系统&#xff09; 2.1 启用 SSH From the Preferences menu, launch Raspberry Pi Configuration. Navigate to the Interfaces tab. Select Enable…...

基于SpringBoot的智慧停车场小程序(源码+论文+部署教程)

运行环境 • 前端&#xff1a;小程序 Vue • 后端&#xff1a;Java • IDE工具&#xff1a;IDEA&#xff08;可自行选择&#xff09; HBuilderX 微信开发者工具 • 技术栈&#xff1a;小程序 SpringBoot Vue MySQL 主要功能 智慧停车场微信小程序主要包含小程序端和…...

【从零开始学习计算机科学】数字逻辑(九)有限状态机

【从零开始学习计算机科学】数字逻辑(九)有限状态机 有限状态机状态机的表示方法有限状态机的Verilog描述有限状态机 有限状态机(简称状态机)相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状…...

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践 引言 在万物互联时代&#xff0c;操作系统对编译技术的需求已从单纯的代码转换演变为跨设备协同、高效资源调度与极致性能优化的综合挑战。华为鸿蒙系统&#xff08;HarmonyOS&#xff09;自主研发的ArkCompiler…...

AI大模型概念知多少

什么是大模型&#xff1f;什么是模型参数 1&#xff09;现在的大模型要解决的问题&#xff0c;就是一个序列数据转换的问题&#xff1a; 输入序列 X X[x1 ,x2 ,...,xm ]&#xff0c; 输出序列Y[y1 ,y2 ,…,yn ]&#xff0c;X和Y之间的关系是&#xff1a;YWX。 “大模型”这个词…...

powermock,mock使用笔记

介于日本的形式主义junit4单体测试&#xff0c;特记笔记&#xff0c;以下纯用手机打出来&#xff0c;因为电脑禁止复制粘贴。 pom文件 powermock-module-junit1.7.4 powermock-api-mokcito 1.7.4 spring-test 8 1&#xff0c;测试类头部打注解 RunWith(PowerMockRunner.class…...

基于置换对称性的模型融合:实现凸盆地单盆地理论

【摘要】 一种合并神经网络模型的新方法,通过置换对称性来合并模型。即使在大规模的非凸优化问题中,神经网络损失景观似乎通常只有一个(几乎)封闭的盆地,这在很大程度上归因于隐藏层单元置换对称性。作者介绍了三种算法,用于将一个模型的单元置换为与参考模型对齐,从而…...

把握好自己的节奏, 别让世界成为你的发条匠

我见过凌晨两点还在回复工作群消息的职场妈妈&#xff0c;也见过凌晨三点抱着手机刷短视频的年轻人。 地铁站台的上班族永远在狂奔&#xff0c;连刚会走路的小孩都被早教班塞满了日程表。 现如今生活节奏快&#xff0c;像一只巨大的发条&#xff0c;每个人都被拧得紧紧的&#…...

linux awk命令和awk语言

linux awk和awk语言 通常大家说的awk几乎都是在linux/unix中使用的awk命令&#xff0c;见下&#xff0c; https://www.geeksforgeeks.org/awk-command-unixlinux-examples/ 作为命令使用的话&#xff0c;存在下内容 Awk 是一个工具&#xff0c;使程序员能够编写小巧但有效的…...

电脑网络出现问题!简单的几种方法解除电脑飞行模式

在某些情况下&#xff0c;您可能需要关闭电脑上的飞行模式以便重新连接到 Wi-Fi、蓝牙或其他无线网络。本教程中简鹿办公将指导您如何在 Windows 和 macO S操作系统上解除飞行模式。 一、Windows 系统下解除飞行模式 通过快捷操作中心 步骤一&#xff1a;点击屏幕右下角的通知…...

ASP.NET Core 6 MVC 文件上传

概述 应用程序中的文件上传是一项功能&#xff0c;用户可以使用该功能将用户本地系统或网络上的文件上传到 Web 应用程序。Web 应用程序将处理该文件&#xff0c;然后根据需要对文件进行一些验证&#xff0c;最后根据要求将该文件存储在系统中配置的用于保存文件的存储中&#…...

【VBA】WPS/PPT设置标题字体

通过VBA&#xff0c;配合左上角的快速访问工具栏&#xff0c;实现自动化调整 选中文本框的 字体位置、大小、颜色。 配合quicker更加便捷 Sub DisableAutoWrapAndFormat()Dim shp As Shape 检查是否选中了一个形状&#xff08;文本框&#xff09;If ActiveWindow.Selection.Typ…...

白盒测试(4):电源瞬态电流测试

电源瞬态电流测试至关重要&#xff0c;主要用于评估电源在负载突变时的响应能力。通过测试&#xff0c;可以确保电源在短时间内提供足够的电流并快速恢复稳定&#xff0c;避免电压波动或系统故障。这对于保证电子设备的可靠性和稳定性尤为关键&#xff0c;尤其是在高动态负载应…...

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合&#xff08;3D-Video Integration&#xff09;是一种将虚拟三维模型无缝嵌入实拍视频场景的技术&#xff0c;广泛应用于影视特效、增强现实&#xff08;AR&#xff09;、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…...

DeepSeek提问术:解锁AI交互新姿势-20 个精准提问框架

一、引言 在人工智能的浩瀚星空中,DeepSeek 无疑是一颗耀眼的新星,以其独特的光芒照亮了 AI 发展的新路径。自问世以来,DeepSeek 凭借先进的技术架构、强大的自然语言处理能力和出色的性能表现,迅速在竞争激烈的 AI 领域崭露头角,成为众多开发者、研究人员以及各行业从业者…...

避免魔法值和多层if的关键:编程范式和设计模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、案例分析二、技术手段函数式接口在枚举中 三、优化后完整代码总结 前言 提示&#xff1a;避免魔法值和多层if的关键&#xff1a;编程范式和设计模式&#…...

第六课:数据存储三剑客:CSV/JSON/MySQL

在Python的数据存储与处理领域&#xff0c;CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用&#xff0c;无论是简单的数据交换、轻量级的数据存储&#xff0c;还是复杂的关系型数据库管理&#xff0c;都能找到它们的身影。本文将详…...

Qt常用控件之表格QTableWidget

表格QTableWidget QTableWidget 是一个表格控件&#xff0c;行和列交汇形成的每个单元格&#xff0c;是一个 QTableWidgetItem 对象。 1. QTableWidget属性 QTableWidget 的属性只有两个&#xff1a; 属性说明rowCount当前行的个数。columnCount当前列的个数。 2. QTableW…...

基于websocket的多用户网页五子棋 --- 测试报告

目录 功能测试自动化测试性能测试 功能测试 1.登录注册页面 2.游戏大厅页面 3.游戏房间页面 自动化测试 1.使用脑图编写web自动化测试用例 2.创建自动化项目&#xff0c;根据用例通过selenium来实现脚本 根据脑图进行测试用例的编写&#xff1a; 每个页面一个测试类&am…...

TypeError: Cannot assign to read only property ‘xxx‘ of object ‘#<Object>‘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

SyntaxError: Unexpected token ‘xxx‘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

简记_开关电源基础知识(二)

一、控制器与稳压器 假设开关损耗、导通损耗、驱动损耗的变化远小于输出功率的变化&#xff08;可忽略&#xff09;&#xff0c;则占空比越大&#xff0c;Po越大&#xff0c;效率越高。 二、同步与非同步 同步是采用通态电阻极低的MOSFET来取代整流二极管&#xff0c;以降低整…...

grum-与gam-词源故事

“grum”词根的含义主要与“咕隆、发哼声、咕咕叫、发隆隆声”等相关。在16世纪90年代后&#xff0c;这个词开始被用来表示发出低沉持续的咆哮声或隆隆声&#xff0c;类似于饥饿的胃或某些动物发出的声音。 早期的富贵家族经常雇佣人去干活&#xff0c;体力活很容易因为劳工过…...

联合索引关于In和范围查询影响索引使用的情况分析

索引类型 1、unique &#xff0c;唯一索引 2、normal&#xff0c;普通索引 3、fulltext, 全文索引 4、spatial&#xff0c;空间索引 样例 三个字段的联合索引&#xff0c;走一个字段是key_len是5&#xff0c;三个是15. 联合索引关于 使用in是不影响后续列 范围查询大于或小于…...