SpringBoot2集成xxl-job详解
官方教程
搭建调度中心
Github
Gitee
注
:版本3.x开始要求Jdk17;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求,可选择接入不同版本
- clone源代码
- 执行
xxl-job\doc\db\tables_xxl_job.sql
#
# XXL-JOB v2.4.1
# Copyright (c) 2015-present, xuxueli.CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `xxl_job`;SET NAMES utf8mb4;CREATE TABLE `xxl_job_info` (`id` int(11) NOT NULL AUTO_INCREMENT,`job_group` int(11) NOT NULL COMMENT '执行器主键ID',`job_desc` varchar(255) NOT NULL,`add_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,`author` varchar(64) DEFAULT NULL COMMENT '作者',`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',`schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',`schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',`misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',`glue_source` mediumtext COMMENT 'GLUE源代码',`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`job_group` int(11) NOT NULL COMMENT '执行器主键ID',`job_id` int(11) NOT NULL COMMENT '任务,主键ID',`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',`trigger_code` int(11) NOT NULL COMMENT '调度-结果',`trigger_msg` text COMMENT '调度-日志',`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',`handle_code` int(11) NOT NULL COMMENT '执行-状态',`handle_msg` text COMMENT '执行-日志',`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',PRIMARY KEY (`id`),KEY `I_trigger_time` (`trigger_time`),KEY `I_handle_code` (`handle_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_log_report` (`id` int(11) NOT NULL AUTO_INCREMENT,`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_logglue` (`id` int(11) NOT NULL AUTO_INCREMENT,`job_id` int(11) NOT NULL COMMENT '任务,主键ID',`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',`glue_source` mediumtext COMMENT 'GLUE源代码',`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',`add_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_registry` (`id` int(11) NOT NULL AUTO_INCREMENT,`registry_group` varchar(50) NOT NULL,`registry_key` varchar(255) NOT NULL,`registry_value` varchar(255) NOT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_group` (`id` int(11) NOT NULL AUTO_INCREMENT,`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',`title` varchar(12) NOT NULL COMMENT '执行器名称',`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',`address_list` text COMMENT '执行器地址列表,多地址逗号分隔',`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '账号',`password` varchar(50) NOT NULL COMMENT '密码',`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',PRIMARY KEY (`id`),UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_lock` (`lock_name` varchar(50) NOT NULL COMMENT '锁名称',PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');commit;
- 修改
xxl-job-admin
中的application.properties
文件配置,主要修改数据库用户密码,及邮箱配置
# Web服务端口,默认8080
server.port=8080
# 应用上下文路径,访问地址会变成http://host:8080/xxl-job-admin
server.servlet.context-path=/xxl-job-admin# Actuator监控端点的上下文路径
management.server.servlet.context-path=/actuator
# 是否启用邮件健康检查,false表示禁用
management.health.mail.enabled=false# Spring MVC静态资源加载配置
# servlet启动时加载顺序,0表示延迟加载
spring.mvc.servlet.load-on-startup=0
# 静态资源访问路径模式
spring.mvc.static-path-pattern=/static/**
# 静态资源存放位置
spring.resources.static-locations=classpath:/static/# Freemarker模板引擎配置
# 模板文件加载路径
spring.freemarker.templateLoaderPath=classpath:/templates/
# 模板文件后缀
spring.freemarker.suffix=.ftl
# 模板编码格式
spring.freemarker.charset=UTF-8
# 模板中可访问的request对象属性名
spring.freemarker.request-context-attribute=request
# 数字格式化规则
spring.freemarker.settings.number_format=0.##########
# 更安全的类解析策略
spring.freemarker.settings.new_builtin_class_resolver=safer# MyBatis配置
# Mapper XML文件位置
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
# 实体类别名包路径(当前被注释)
#mybatis.type-aliases-package=com.xxl.job.admin.core.model# 数据库连接配置
# MySQL连接URL,包含时区设置和编码配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
# 数据库用户名
spring.datasource.username=root
# 数据库密码
spring.datasource.password=root
# JDBC驱动类名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 数据库连接池配置(HikariCP)
# 连接池类型
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=10
# 最大连接池大小
spring.datasource.hikari.maximum-pool-size=30
# 是否自动提交事务
spring.datasource.hikari.auto-commit=true
# 连接空闲超时时间(毫秒)
spring.datasource.hikari.idle-timeout=30000
# 连接池名称
spring.datasource.hikari.pool-name=HikariCP
# 连接最大生命周期(毫秒)
spring.datasource.hikari.max-lifetime=900000
# 连接超时时间(毫秒)
spring.datasource.hikari.connection-timeout=10000
# 连接测试查询语句
spring.datasource.hikari.connection-test-query=SELECT 1
# 连接验证超时时间(毫秒)
spring.datasource.hikari.validation-timeout=1000# 邮件服务配置(用于任务告警)
# SMTP服务器地址
spring.mail.host=smtp.qq.com
# SMTP端口
spring.mail.port=25
# 任务执行失败时,发件邮箱用户名
spring.mail.username=xxx@qq.com
# 任务执行失败时,发件人邮箱地址
spring.mail.from=xxx@qq.com
# 邮箱密码/授权码
spring.mail.password=xxx
# SMTP认证配置
spring.mail.properties.mail.smtp.auth=true
# 启用STARTTLS加密
spring.mail.properties.mail.smtp.starttls.enable=true
# 要求STARTTLS加密
spring.mail.properties.mail.smtp.starttls.required=true
# SSL Socket工厂类
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory# XXL-JOB安全配置
# 访问令牌,用于API调用的鉴权
xxl.job.accessToken=default_token# 国际化配置
# 默认中文简体,可选zh_CN(简体中文)、zh_TC(繁体中文)、en(英文)
xxl.job.i18n=zh_CN# 触发器线程池配置
# 快速任务线程池最大大小
xxl.job.triggerpool.fast.max=200
# 慢速任务线程池最大大小
xxl.job.triggerpool.slow.max=100# 日志保留配置
# 任务日志保留天数
xxl.job.logretentiondays=30
- 启动项目访问
http://host:8080/xxl-job-admin
,账号密码为admin 123456
搭建执行器端
- 新建springboot项目
- 引入Maven
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version></dependency>
注:可直接将clone下来的以下代码复制过去,或者按照下方的配置手动创建
- 创建配置
# 服务端口配置
server:# 应用启动端口,默认8082port: 8082# 日志配置
logging:# 指定logback日志配置文件位置(classpath路径)config: classpath:logback.xml# XXL-JOB执行器配置
xxl:job:# 调度中心配置admin:# 调度中心地址(必须修改为实际部署的调度中心地址)# 格式:http://{调度中心IP}:{端口}/xxl-job-adminaddresses: http://127.0.0.1:8080/xxl-job-admin# 访问令牌(需与调度中心配置的xxl.job.accessToken保持一致)accessToken: default_token# 执行器配置executor:# 执行器应用名称(需在调度中心"执行器管理"中注册)appname: xxl-job-executor-sample# 执行器地址(自动获取,一般无需配置)address:# 执行器IP(自动获取,一般无需配置)ip:# 执行器端口(必须配置,用于接收调度中心请求)port: 9999# 任务日志存储路径(相对路径或绝对路径)logpath: ./logs/xxl-job-executor-sample# 日志保留天数logretentiondays: 30
- 创建日志配置
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds"><contextName>logback</contextName><property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern></rollingPolicy><encoder><pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="console"/><appender-ref ref="file"/></root></configuration>
- 创建配置
package com.com.xxl.job.executor.core.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}}
- 创建定时任务
@Component
public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、简单任务示例(Bean模式)*/@XxlJob("testTask")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");String param = XxlJobHelper.getJobParam();logger.info("执行次数简单任务示例,当前时间:{},任务参数:{}", DateUtil.formatDateTime(new Date()),param);}}
-
启动当前服务
-
新增任务
-
点击启动,开始执行定时任务
-
查看执行日志
其他配置参数项含义说明
@XxlJob参数说明
@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")
key | 说明 |
---|---|
value | 自定义jobhandler名称,对应任务管理-新增-jobhandler![]() |
init | JobHandler初始化方法 执行时机:(1)首次调度前执行:当执行器启动后,任务第一次被触发前(仅执行 一次)。(2)重新部署时:如果执行器重启或应用重新部署,任务再次触发前会 重新执行 init。(3)不会在每次调度前执行:即使任务被多次触发(如每分钟执行一次),init 不会重复执行 |
destroy | JobHandler销毁方法 执行时机:(1)应用正常关闭时:通过 Spring 的优雅停机机制触发(一次)。(2)执行器卸载时:当执行器从调度中心移除或应用崩溃时 可能不会执行(依赖 JVM 生命周期)。(3)不会在每次任务完成后执行:即使任务运行多次,destroy 不会在每次任务结束时触发。且在任务管理—操作—删除,也不会触发 |
任务的参数传递及获取
- 传递
- 获取
String param = XxlJobHelper.getJobParam();
- 执行次数简单任务示例,当前时间:2025-05-10 18:57:12,任务参数:userId=123&type=export&date=2023-10-01
XxlJobHelper API 详解
String getJobParam()
作用:获取调度中心配置的任务参数(任务管理界面填写的"任务参数")。
返回值:字符串格式的参数(如 key1=value1&key2=value2)。
场景:
@XxlJob("demoJob")
public void demoJob() {String param = XxlJobHelper.getJobParam(); // 获取参数if (param.contains("key1")) {}
}
int getShardIndex()
作用:获取当前执行器的分片序号(从 0 开始)。
返回值:当前分片索引(如 0、1)。
场景:
int shardIndex = XxlJobHelper.getShardIndex();
String tableSuffix = "_" + shardIndex; // 按分片选择表
int getShardTotal()
作用:获取总分片数(等于在线执行器数量)。
返回值:总分片数(如 2)。
场景:
int shardTotal = XxlJobHelper.getShardTotal();
int batchSize = totalRecords / shardTotal; // 计算每片处理量
log(String log)
作用:记录任务执行日志(可在调度日志—操作—执行日志查看)。
参数:日志内容字符串。
场景:
XxlJobHelper.log("开始处理分片数据...");
try {process();XxlJobHelper.log("处理成功");
} catch (Exception e) {XxlJobHelper.log("处理失败: " + e.getMessage());
}
boolean handleSuccess(String msg)
作用:标记任务成功结束。
参数:成功提示信息。
场景:
if (importData()) {XxlJobHelper.handleSuccess("数据导入完成");
}
boolean handleFail(String msg)
作用:标记任务失败并触发告警。
参数:失败原因。
场景:
try {riskyOperation();
} catch (Exception e) {XxlJobHelper.handleFail("操作失败: " + e.getMessage());
}
String getJobId()
作用:获取当前任务的唯一ID。
返回值:任务ID字符串。
场景:
String jobId = XxlJobHelper.getJobId();
redis.set("running:" + jobId, "true");
String getJobLogFileName()
作用:获取当前任务日志文件路径。
返回值:日志文件绝对路径。
场景:
String logFile = XxlJobHelper.getJobLogFileName();
backupLog(logFile); // 备份日志
setAppParam(String appParam)
作用:动态设置任务参数。
参数:参数字符串(格式同getJobParam())。
场景:
XxlJobHelper.setAppParam("page=2&retry=1");
// 后续任务可通过 getJobParam() 获取
完整代码示例
@XxlJob("advancedJob")
public void advancedJob() {// 1. 获取参数和分片信息String param = XxlJobHelper.getJobParam();//当前执行器的分片下标int shardIndex = XxlJobHelper.getShardIndex();//总计分片数量int shardTotal = XxlJobHelper.getShardTotal();XxlJobHelper.log("参数: " + param + ", 分片: " + shardIndex + "/" + shardTotal);// 2. 分片处理数据List<Data> dataList = fetchData(shardIndex, shardTotal);if (dataList.isEmpty()) {XxlJobHelper.handleSuccess("无数据可处理");return;}// 3. 处理并记录日志try {for (Data data : dataList) {process(data);XxlJobHelper.log("已处理: " + data.getId());}XxlJobHelper.handleSuccess("处理完成,共" + dataList.size() + "条");} catch (Exception e) {XxlJobHelper.handleFail("处理异常: " + e.getMessage());}
}
相关文章:
SpringBoot2集成xxl-job详解
官方教程 搭建调度中心 Github Gitee 注:版本3.x开始要求Jdk17;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求,可选择接入不同版本 clone源代码执行xxl-job\doc\db\tables_xxl_job.sql # # XXL-JOB v2.4.1 # Copyright (c) 2015-present, x…...
洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术
目录 一、洛图报告新焦点:FSHD 为何成为显示产业重要突破方向? (一)洛图报告核心结论:从技术突围到产业重构 二、技术解析:FSHD 如何重构显示底层逻辑? (一)物理架构…...
关于数据库查询速度优化
本人接手了一个关于项目没有任何文档信息的代码,代码也没有相关文档说明信息!所以在做数据库查询优化的时候不敢改动。 原因1: 老板需要我做一个首页的统计查询。明明才几十万条数据,而且我加了筛选条件为什么会这么慢ÿ…...
两数相加(2)
2. 两数相加 - 力扣(LeetCode) 解法: class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * dummy new ListNode(0);int carry 0;ListNode * head dummy;while (l1 ! nullptr || l2 ! nullptr ||…...
车载学习(6)——CAPL(1)一些基础知识
1.一些CAPL的知识 CAPL通讯访问编程语言(Commmunication Access Programming language) CAPL的用途 ECU的仿真实现(报文的收发、数据的处理)实现总线日志纪录的控制实现总线数据自动化分析实现ECU功能的自动化测试实现ECU报文发…...
C++笔记-set和map的使用(包含multiset和multimap的讲解)
1.序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系࿰…...
GLPK(GNU线性规划工具包)介绍
GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包),可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库,最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载,仅包含源码,最新版本为5.0。 GLPK是…...
技嘉主板BIOS升级
截图可能不同的BIOS长的不一样,但大概相同,BIOS不下错,逐个版本升级就没问题 准备工作 准备工作一个fat32格式的U盘,用来存放BIOS确认主板型号 和当前BIOS版本 方式1:去系统信息里面 方式2: 去BIOS设置…...
自定义类型:结构体进阶
一、结构体类型的声明 前⾯我们在学习操作符和初阶结构体的时候,已经学习了结构体的知识,这⾥稍微复习⼀下。 1.1结构体的回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag…...
linux perf top分析系统性能
1,看到内核宏是否支持perf功能 perf top -g 查看linux 内核宏定义 CONFIG_PERF_EVENTS=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_FRAME_POINTER=y # 确保帧指针支持以捕获完整堆栈 2,使用perf top -g 报错 Access to performance monitoring and observability operations is l…...
串口屏调试 1.0
http://wiki.tjc1688.com 先把商家的链接贴过来 淘晶驰T1系列3.2寸串口屏tft液晶屏显示屏HMI触摸屏超12864液晶屏 这是主包的型号 打开这个玩意 有十个基本的功能区 新建工程 在界面的右边,指令一定要写在page前面,这里的波特率等等什么的都可以…...
Python面向对象编程:初识类与对象
面向对象编程(OOP)是Python编程中最重要的范式之一。本文将从零开始介绍Python中类和对象的基本概念,帮助初学者快速掌握面向对象编程的核心思想。 一、什么是面向对象编程? 面向对象编程(Object-Oriented Programming)是一种以"对象"为核心…...
局域网常用的测速工具,Iperf3使用教程
目录 下载方式 Windows Linux 使用方法:测试局域网带宽 步骤一:服务端准备 步骤二:客户端发起连接 步骤三:查看结果 参数说明 1. Iperf常用参数(测试够用) 2. 通用参数(Server端和Cli…...
[架构之美]linux常见故障问题解决方案(十九)
[架构之美]linux下常见故障问题解决方案 一,文本文件忙 问题一:rootwh-VMware-Virtual-Platform:/home/hail# cp /root/containerd/bin/* /usr/bin/ cp: 无法创建普通文件 ‘/usr/bin/containerd’: 文本文件忙 在Linux系统中遇到“文本文件忙”错误时…...
Java与Go语言对比教程
Java vs. Go:程序员的双节棍与瑞士军刀之战 🎯 先看一张灵魂对比图 🤖 Java老大哥 🚀 Go小钢炮 出生年份 1995(中年稳健) 2009(年轻活力&…...
计算机大类专业数据结构下半期实验练习题
1068: 图的按录入顺序深度优先搜索 #include"iostream" using namespace std; #include"cstring" int visited[100]; char s[100]; int a[100][100]; int n; void dfs(int k,int n) {if(visited[k]0){visited[k]1;cout<<s[k];for(int i0;i<n;i){i…...
Android 关闭Activity切换过渡动画
Android 9.0以前关闭过渡动画效果只需要把开发者模式中过渡动画缩放设为0就可以。也就是把def_window_transition_scale改为0% frameworks/base/packages/SettingsProvider/res/values/defaults.xml <fraction name"def_window_transition_scale">100%<…...
iperf3的介绍与舒勇
在 CentOS 7 中使用 iperf3 进行网络性能测试,分为客户端和服务器两部分。以下是使用步骤: 1. 安装 iperf3 首先,你需要在 CentOS 7 上安装 iperf3。可以通过以下命令进行安装: sudo yum install epel-release sudo yum install…...
Python 包管理新选择:uv
在 Python 中,uv 是由 Astral 公司开发的 Rust 高性能包管理工具,旨在替代传统 pip 并提供更快的依赖管理、Python 版本控制等功能。 https://github.com/astral-sh/uv 在 github 上已有 53k star 一、uv 的核心优势 极速性能:比 pip 快 10-100 倍。多版本 Python 管理:支…...
从需求到用例的AI路径:准确率与挑战
用工作流生成测试用例和自动化测试脚本! 引言:用例的黄金起点 在软件工程中,“测试用例”是连接需求理解与质量保障之间的关键桥梁。一份高质量的测试用例,不仅是验证功能实现是否符合需求的工具,更是产品风险感知、用…...
JavaSE核心知识点02面向对象编程02-06(泛型)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点02面向对象编程02-06&#…...
xml与注解的区别
功能xml配置注解定义bean bean标签 id属性 class属性 Component Controller Service Repository ComponentScan 设置依赖注入 setter注入(set方法) 构造器注入(构造方法) Autowired Qualifier Value 配置第三方bean bean标签 静…...
进阶 DFS 学习笔记
字数:12017字。 文章盗的图注明了出处,全部出自 y 总的算法提高课。 不知道为啥这个时候才开始学这个东西,好像是很多同龄人都已经学完了。 进阶 DFS 具体来说好几个东西,所以可能内容有一些些多。 默认 DFS 和 BFS 已经掌握了…...
计算机设计大赛山东省赛区软件开发赛道线上答辩复盘
流程回顾: 1.抽签顺序: 抽签顺序并不一定代表是最终顺序,要注意看通知不要遗漏。 2.答辩形式: 线上答辩,加入腾讯会议,进会议时自己的备注是作品编号,等轮到自己组答辩时主持人会把人拉进来…...
第7次课 栈A
课堂学习 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等&…...
TXT编码转换工具iconv
iconv.exe是实现TXT编码转换的命令行工具,支持几百种编码格式的转换,利用它可以在自主开发程序上实现TXT文档编码的自动转换。 一、命令参数格式 Usage: iconv [-c] [-s] [-f fromcode] [-t tocode] [file ...] or: iconv -l 二、转换的示例 将UTF-8…...
基于Spring Boot + Vue的高校心理教育辅导系统
一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…...
关于甲骨文(oracle cloud)丢失MFA的解决方案
前两年,申请了一个招商的多币种信用卡,然后就从网上撸了一个oracle的免费1h1g的服务器。 用了一段时间,人家要启用MFA验证。 啥叫MFA验证,类似与短信验证吧,就是绑定一个手机,然后下载一个app,每…...
Linux系统管理与编程17:自动化部署ftp服务
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 #virtual用户管理:passerbyA、captain和admin三个虚拟用户 # passerbyA只能看,captain可看读写上传,但不能删除。admin全部权限 [rootshell shell]…...
C++STL——stack,queue
stack与queue 前言容器适配器deque 前言 本篇主要讲解stack与queue的底层,但并不会进行实现,stack的接口 queue的接口 ,关于stack与queue的接口在这里不做讲解,因为通过前面的对STL的学习,这些接口都是大同小异的。 …...
HC-SR04超声波测距传感器
1.基本信息 供电电压5v,测量范围2cm~400cm,测量精度正负3mm,超声波频率40khz 2.连接引脚: 3.工作原理 TRIG引脚发送至少10us的高电平信号,ECHO引脚负责接受信号; 接受方式:计算测量高电平持续的时间,从一…...
内存安全暗战:从 CVE-2025-21298 看 C 语言防御体系的范式革命
引言 2025 年 3 月,美国 CERT 发布的《年度漏洞报告》揭示了触目惊心的数据:C/C 相关漏洞占全年高危漏洞的 68%,其中内存安全问题贡献了 92% 的远程代码执行风险。当 CVE-2025-21298 漏洞在某工业控制软件中被利用,导致欧洲某核电…...
Linux笔记---System V共享内存
1. System V共享内存简介 System V共享内存是一种在Linux系统中用于进程间通信的机制。顾名思义,就是申请一段可供多个进程共享的内存,以用于进程间通信,相对于管道机制要更加直接。 1.1 原理 System V共享内存通过创建和使用一个特定的IP…...
MySQL 1366 - Incorrect string value:错误
MySQL 1366 - Incorrect string value:错误 错误如何发生发生原因: 解决方法第一种尝试第二种尝试 错误 如何发生 在给MySQL添加数据的时候发生了下面的错误 insert into sys_dept values(100, 0, 0, 若依科技, 0, 若依, 15888888888, ryqq.com, 0,…...
慈缘基金会“蝴蝶飞”助西藏女孩白玛卓嘎“折翼重生”
历经六个月、178天的艰难治疗,来自西藏拉萨的15岁女孩白玛卓嘎,终于在4月底挺直脊梁,带着自信的笑容踏上了回家的路。这场跨越雪域高原与首都北京的“生命蜕变之旅”,不仅改写了这位藏族少女的人生轨迹,更见证了公益力…...
【生存技能】ubuntu 24.04 如何pip install
目录 原因解决方案说明 在接手一个新项目需要安装python库时弹出了以下提示: 原因 这个报错是因为在ubuntu中尝试直接使用 pip 安装 Python 包到系统环境中,ubuntu 系统 出于稳定性考虑禁止了这种操作 这里的kali是因为这台机器的用户起名叫kali,我也不知道为什么…...
TDengine 在智能制造中的核心价值
简介 智能制造与数据库技术的深度融合,已成为现代工业技术进步的一个重要里程碑。随着信息技术的飞速发展,智能制造已经成为推动工业转型升级的关键动力。在这一进程中,数据库技术扮演着不可或缺的角色,它不仅承载着海量的生产数…...
代码随想录第41天:图论2(岛屿系列)
一、岛屿数量(Kamacoder 99) 深度优先搜索: # 定义四个方向:右、下、左、上,用于 DFS 中四向遍历 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度…...
C语言复习--柔性数组
柔性数组是C99中提出的一个概念.结构体中的最后⼀个元素允许是未知大小的数组,这就叫做柔性数组成员。 格式大概如下 struct S { int a; char b; int arr[];//柔性数组 }; 也可以写成 struct S { int a; char b; int arr[0];//柔性数组 }; …...
《Python星球日记》 第55天:迁移学习与预训练模型
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、迁移学习基础1. 什么是迁移学习?2. 迁移学习的优势3. 迁移学习的…...
Python项目75:PyInstaller+Tkinter+subprocess打包工具1.0(安排 !!)
这个打包工具包含以下功能: 1.主要功能:选择Python脚本文件,设置打包选项(单文件打包、无控制台窗口),自定义程序图标,指定输出目录,实时显示打包日志。 2.自适应布局改进ÿ…...
互联网大厂Java面试实录:从基础到微服务的深度考察
互联网大厂Java面试实录:从基础到微服务的深度考察 面试场景 面试官:风清扬(严肃且技术深厚) 求职者:令狐冲(技术扎实但偶尔含糊) 第一轮:Java基础与框架 风清扬:令狐…...
学习黑客5 分钟深入浅出理解Linux进程管理
5 分钟深入浅出理解Linux进程管理 🖥️ 大家好!今天我们将探索Linux系统中的进程管理——这是理解系统运行机制和进行安全分析的基础知识。在TryHackMe平台上进行网络安全学习时,了解进程如何工作以及如何监控和控制它们,对于识别…...
Kubernetes应用发布方式完整流程指南
Kubernetes(K8s)作为容器编排领域的核心工具,其应用发布流程体现了自动化、弹性和可观测性的优势。本文将通过一个Tomcat应用的示例,详细讲解从配置编写到高级发布的完整流程,帮助开发者掌握Kubernetes应用部署的核心步…...
JVM——即时编译器的中间表达形式
中间表达形式(IR):编译器的核心抽象层 1. IR的本质与作用 在编译原理的体系中,中间表达形式(Intermediate Representation, IR)是连接编译器前端与后端的桥梁。前端负责将源代码转换为IR,而后…...
Js 判断浏览器cookie 是否启用
验证时 google浏览器 135.0.7049.117 不生效 cookie.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>Cookie 检测</title> </head> <body><h1>检测是否启用 Cookie<…...
数字相机的快门结构
数字相机(DC/DSLR等)的快门结构和传统相机有所不同,除了机械快门以外,还存在电子快门,实际上是二者的混合体。我写这篇文章大概介绍一下数字相机的快门结构,希望能抛砖引玉。 要讨论数字相机的快门结构,首先先要了解一下数字相机的结构分类,根据成像原理不同,数字相机大…...
LeetCode --- 448 周赛
题目列表 3536. 两个数字的最大乘积 3537. 填充特殊网格 3538. 合并得到最小旅行时间 3539. 魔法序列的数组乘积之和 一、两个数字的最大乘积 由于数据都是正数,所以乘积最大的两个数,本质就是找数组中最大的两个数即可,可以排序后直接找到…...
添加物体.
在cesium中我们可以添加物体进入地图.我们以广州塔为例 //生成广州塔的位置var position2 Cesium.Cartesian3.fromDegrees(113.3191,23.109,100)viewer.camera.setView({//指定相机位置destination: position2, 运行后如图 我们使用cesium官网提供的代码为广州塔在地图上标点…...
ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例
ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例 在现代工业自动化系统中,设备之间的互联互通至关重要。Profibus DP和Modbus TCP是两种常见的通信协议,分别应用于不同的场景。为了实现这两种协议的相互转换,Profibus …...