xxl-job 数据库表详解
--------------------------------------------------------------------------
XXL-JOB 的数据库表设计围绕分布式任务调度的核心功能展开,主要包括任务配置、执行器管理、日志记录、状态监控等模块。以下是核心表的详细解析(基于 2.4.0+ 版本):
一、核心配置表
1. xxl_job_group - 执行器分组表
- 作用:管理任务执行器(Executor)的分组信息,支持按业务维度隔离任务。
- 关键字段:
字段名 类型 说明 idint(11)主键 ID app_namevarchar(64)执行器的应用名称(用于自动注册时的分组标识) titlevarchar(64)执行器的显示名称(控制台展示) address_typeint(4)执行器地址类型: 0- 自动注册(执行器主动上报地址)1- 手动录入地址列表address_listvarchar(512)执行器地址列表(手动录入时使用,格式: IP1:PORT,IP2:PORT) - 关联关系:
xxl_job_info通过job_group字段关联执行器分组。
2. xxl_job_info - 任务信息表
- 作用:存储所有任务的元数据配置,包括调度策略、执行逻辑、报警规则等。
- 关键字段:
字段名 类型 说明 idint(11)任务 ID job_groupint(11)执行器分组 ID(关联 xxl_job_group)schedule_typevarchar(50)调度类型: CRON- Cron 表达式FIX_RATE- 固定频率(毫秒)FIX_DELAY- 固定延迟(毫秒)schedule_confvarchar(128)调度配置: 对CRON是 Cron 表达式,对FIX_RATE是间隔时间executor_route_strategyvarchar(50)执行器路由策略: FIRST- 第一个存活实例ROUND- 轮询RANDOM- 随机executor_handlervarchar(255)执行器任务处理器名称(对应 @XxlJob注解的 value)glue_typevarchar(50)任务类型: BEAN- Java 方法GLUE_GROOVY- Groovy 脚本trigger_statustinyint(4)任务状态: 0- 停止1- 运行trigger_last_timebigint(13)上次触发时间(时间戳,毫秒) trigger_next_timebigint(13)下次触发时间(时间戳,毫秒) - 示例 SQL:
sql
CREATE TABLE `xxl_job_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `job_group` int(11) NOT NULL, `schedule_type` varchar(50) NOT NULL DEFAULT 'CRON', `schedule_conf` varchar(128) DEFAULT NULL, `executor_route_strategy` varchar(50) DEFAULT NULL, `executor_handler` varchar(255) DEFAULT NULL, `glue_type` varchar(50) NOT NULL, `trigger_status` tinyint(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
二、任务执行与日志表
3. xxl_job_log - 任务日志表
- 作用:记录任务执行的详细日志,包括触发结果、执行耗时、异常信息等。
- 关键字段:
字段名 类型 说明 idbigint(20)日志 ID job_idint(11)关联的任务 ID(对应 xxl_job_info.id)trigger_timedatetime任务触发时间 trigger_codeint(11)触发状态码: 200- 成功500- 失败handle_timedatetime任务开始执行时间 handle_codeint(11)执行状态码: 200- 成功500- 失败0- 执行中alarm_statustinyint(4)告警状态: 0- 未告警1- 无需告警2- 告警成功3- 告警失败 - 关联关系:通过
job_id关联xxl_job_info,通过executor_address关联执行器实例。
4. xxl_job_log_report - 日志报表表
- 作用:按天统计任务执行情况,用于控制台报表展示。
- 关键字段:
字段名 类型 说明 idint(11)报表 ID trigger_daydatetime统计日期(精确到天) suc_countint(11)当天成功任务数 fail_countint(11)当天失败任务数 - 数据更新:调度中心每分钟自动统计前一天的日志数据。
三、动态注册与锁表
5. xxl_job_registry - 执行器注册表
- 作用:存储执行器和调度中心的动态注册信息,实现执行器地址的自动发现。
- 关键字段:
字段名 类型 说明 registry_groupvarchar(50)注册类型: EXECUTOR- 执行器ADMIN- 调度中心registry_keyvarchar(255)注册键(对 EXECUTOR是app_name,对ADMIN是调度中心地址)registry_valuevarchar(255)注册值(执行器的地址或调度中心的地址) - 机制:
- 执行器启动后向调度中心注册地址,调度中心每 30 秒清理超时 90 秒未心跳的执行器。
- 调度中心根据
registry_value动态维护可用执行器列表。
6. xxl_job_lock - 任务锁表
- 作用:通过数据库行锁实现分布式任务调度的并发控制。
- 关键字段:
字段名 类型 说明 lock_namevarchar(50)锁名称: schedule_lock- 全局调度锁state_access- 任务状态锁 - 示例:
- 调度中心触发任务时,通过
state_access锁确保同一任务不会被多个线程重复触发。 - 执行器回调更新任务状态时,需获取
state_access锁保证原子性。
- 调度中心触发任务时,通过
四、系统与扩展表
7. xxl_job_user - 用户表
- 作用:存储平台用户信息,支持权限管理。
- 关键字段:
字段名 类型 说明 usernamevarchar(50)用户名(唯一) passwordvarchar(50)密码(MD5 加密) roletinyint(4)角色: 0- 普通用户1- 管理员permissionvarchar(255)权限(执行器 ID 列表,逗号分隔)
8. xxl_job_logglue - GLUE 日志表
- 作用:存储 GLUE 脚本的历史版本,支持版本回溯。
- 关键字段:
字段名 类型 说明 job_idint(11)关联的任务 ID glue_sourcemediumtextGLUE 脚本内容 glue_updatetimedatetime脚本更新时间
五、表间关系与核心流程
-
任务注册:
- 用户在控制台创建任务,数据写入
xxl_job_info,关联xxl_job_group中的执行器分组。 - 执行器启动后向
xxl_job_registry表注册地址,调度中心自动发现可用执行器。
- 用户在控制台创建任务,数据写入
-
任务触发:
- 调度中心扫描
xxl_job_info中trigger_next_time <= 当前时间的任务。 - 获取
xxl_job_lock锁后,更新任务状态并记录日志到xxl_job_log。
- 调度中心扫描
-
任务执行:
- 调度中心通过
xxl_job_registry获取执行器地址,调用执行器接口。 - 执行器执行任务后,回调调度中心更新
xxl_job_log中的handle_code和handle_msg。
- 调度中心通过
-
日志与监控:
xxl_job_log记录每次执行的详细信息,xxl_job_log_report按天统计执行结果。- 控制台通过查询这些表展示任务状态、执行趋势等信息。
六、注意事项
- 版本差异:
- 2.3.0 及之前版本包含
xxl_job_qrtz_xxx表(基于 Quartz 调度),2.4.0+ 版本已将其功能整合到xxl_job_info表。
- 2.3.0 及之前版本包含
- 性能优化:
xxl_job_log表数据量可能快速增长,建议定期清理历史日志(通过配置xxl.job.logretentiondays自动清理)。
- 分布式锁机制:
xxl_job_lock表依赖数据库行锁,在高并发场景下可能成为性能瓶颈,需根据实际情况评估是否替换为 Redis 等分布式锁。
通过以上表结构,可深入理解 XXL-JOB 的任务调度、执行、监控等核心功能,为系统运维和二次开发提供数据层面的支持。
--------------------------------------------------------------------------
XXL-JOB 各版本在功能、架构和稳定性上持续迭代,以下是核心版本的关键区别:
一、2.3.0 版本(2022 年)
核心改进:
- 调度过期策略
新增「忽略」或「立即补偿触发一次」策略,解决调度中心因延迟导致的任务漏触发问题。
- 触发方式扩展
除 Cron 外,新增「固定间隔触发」和实验性「固定延时触发」,支持更灵活的任务调度场景。
- 任务辅助工具
引入
XxlJobHelper,统一提供任务参数获取、日志输出、分片参数解析等能力,简化开发流程。 - 执行器注册优化
注册逻辑改为异步方式,提升高并发场景下的注册性能;新增
accessToken校验,增强安全性。 - Cron 编辑器增强
支持实时预览最近运行时间,修复小概率字段重置问题,提升配置体验。
- 数据库适配
优化 Oracle 数据库兼容性,调整 SQL 语法和分页查询逻辑。
二、2.4.0 版本(2023 年)
架构与功能重大升级:
- 移除 Quartz 依赖
彻底废弃 Quartz 调度引擎,自研轻量级调度模块,大幅简化数据库表结构(移除
xxl_job_qrtz_xxx表),提升调度性能和稳定性。 - 任务分片与广播
支持分布式任务分片(Sharding),可将大数据量任务拆分为多个子任务并行执行;新增「广播任务」模式,所有执行器同时执行同一任务。
- GLUE 脚本增强
支持 Java、Shell、Python、PHP、NodeJS 等多语言脚本,任务逻辑可直接在控制台编辑并动态生效,无需重启应用。
- 执行器注册机制
执行器通过 HTTP 接口自动注册到调度中心,支持动态扩缩容和故障转移,替代传统数据库表注册方式。
- 权限控制优化
新增用户角色管理(管理员、普通用户),支持按执行器分组配置权限,实现精细化操作控制。
- 高可用与安全
调度中心集群部署支持自动选举主节点;修复 SSRF、XSS 等安全漏洞,但早期版本(如 2.4.0)仍存在权限绕过风险,需及时升级至 2.4.1+。
三、2.5.0 版本(2025 年)
性能与稳定性优化:
- 线程池与队列优化
调整快慢线程池拒绝策略,避免任务积压导致的结果丢失;优化队列长度,提升突发流量处理能力。
- 日志表索引优化
对
xxl_job_log表添加复合索引,显著提升大日志量场景下的查询和清理速度。 - 执行器注册重构
降低多调度中心地址时的并发注册冲突,新增唯一索引防止冗余数据。
- 依赖升级
更新 Netty、Slf4j 等基础组件至最新稳定版本,提升框架兼容性和安全性。
- 长期维护支持
作为 JDK 8 最后一个大版本,提供长期漏洞修复和性能优化。
四、各版本核心功能对比表
| 功能特性 | 2.3.0 及以下 | 2.4.0+ | 2.5.0+ |
|---|---|---|---|
| 调度引擎 | Quartz | 自研 | 自研 |
| 任务分片与广播 | ❌ | ✅ | ✅ |
| GLUE 多语言支持 | 有限(Java) | ✅ | ✅ |
| 执行器自动注册 | 数据库表 | HTTP | HTTP |
| 权限控制 | 基础 | 角色管理 | 角色管理 |
| 日志表索引优化 | ❌ | ❌ | ✅ |
| 高可用机制 | 数据库锁 | 集群选举 | 集群选举 |
| 安全漏洞修复 | 部分 | 持续 | 持续 |
五、升级建议
-
2.3.x → 2.4.x
- 需手动迁移数据库表结构(移除 Quartz 相关表,新增
xxl_job_log分片字段)。 - 执行器配置需调整注册方式(HTTP 接口替代数据库表)。
- 建议直接升级至 2.4.1+ 以规避 SSRF 等安全风险。
- 需手动迁移数据库表结构(移除 Quartz 相关表,新增
-
2.4.x → 2.5.x
- 数据模型和通讯协议兼容,可无缝升级。
- 建议同步优化
xxl_job_log表索引以提升性能。
-
长期维护选择
- 优先使用 2.5.x 版本,享受 JDK 8 长期支持和最新安全修复。
- 计划迁移至 JDK 11+ 的用户可关注 3.0+ 版本(规划中)。
通过以上版本对比,可根据业务需求和技术栈选择最适合的版本,重点关注架构升级、功能扩展和安全性修复。
--------------------------------------------------------------------------
xxl-job 下载地址
一、如何将 XXL-JOB 从 Quartz 切换到自研调度引擎
XXL-JOB 在 2.4.0 版本及以上 彻底移除了 Quartz 依赖,改用自研调度引擎。因此,“从 Quartz 切换到自研引擎” 本质上是将 XXL-JOB 升级到 2.4.0 及以上版本。以下是详细步骤:
1. 确认当前版本
- 若当前版本为 2.3.x 及以下:依赖 Quartz 调度引擎,需升级到 2.4.0 + 版本以切换到自研引擎。
- 若已为 2.4.0+:默认使用自研引擎,无需额外操作。
2. 升级前准备
- 备份数据:备份现有 XXL-JOB 数据库(尤其是
xxl_job_info、xxl_job_log等核心表),避免升级过程中数据丢失。 - 查看官方升级文档:参考对应版本的 Release Notes(如2.4.0 Release),确认兼容性注意事项。
3. 数据库表结构迁移(核心步骤)
2.4.0 + 版本移除了 Quartz 相关表(如
xxl_job_qrtz_trigger、xxl_job_qrtz_cron_triggers等),并调整了部分核心表结构。需执行官方提供的升级脚本:- 脚本位置:从 XXL-JOB 源码的
doc/db目录中获取对应版本的升级脚本(如xxl_job_upgrade.sql),或直接参考官方文档中的 SQL 语句。 - 核心变更:
- 删除所有
xxl_job_qrtz_*前缀的 Quartz 表; - 对
xxl_job_info表新增字段(如executor_block_strategy用于任务阻塞策略); - 调整
xxl_job_log表索引,优化查询性能。
- 删除所有
4. 调度中心升级
- 替换源码 / 依赖:
- 若使用源码部署:下载 2.4.0 + 版本源码,替换原调度中心(
xxl-job-admin)代码,重新编译打包。 - 若使用 Maven 依赖:在
pom.xml中升级xxl-job-core版本(如2.4.0):xml<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.4.0</version> <!-- 或更高版本 --> </dependency>
- 若使用源码部署:下载 2.4.0 + 版本源码,替换原调度中心(
- 调整配置文件:
- 2.4.0 + 版本移除了 Quartz 相关配置(如
quartz前缀的配置),无需保留; - 确保数据库连接配置正确(指向升级后的数据库)。
- 2.4.0 + 版本移除了 Quartz 相关配置(如
5. 执行器升级
- 依赖升级:同调度中心,将执行器项目的
xxl-job-core依赖升级到 2.4.0 + 版本。 - 适配注册机制:
2.4.0 + 版本执行器注册方式从 “数据库表注册” 改为 “HTTP 主动注册”,需调整执行器配置:properties
# 执行器配置(application.properties) xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin # 调度中心地址(必填) xxl.job.executor.appname=your-executor-appname # 执行器应用名(需与调度中心配置一致) xxl.job.executor.port=9999 # 执行器端口(可选,默认自动分配) - 代码兼容性:
- 2.4.0 + 版本的
@XxlJob注解用法不变,无需修改任务代码; - 若使用了 Quartz 相关 API(如
XxlJobQuartz),需移除并替换为自研引擎的 API(参考官方示例)。
- 2.4.0 + 版本的
6. 验证升级结果
- 启动调度中心和执行器,确认无报错;
- 在调度中心控制台查看任务列表,确认历史任务配置已迁移;
- 手动触发一个任务,检查
xxl_job_log表是否正常记录日志,验证调度引擎工作正常。
二、XXL-JOB 下载地址
XXL-JOB 的官方下载渠道为 GitHub,支持源码下载和 RELEASE 包下载:
-
RELEASE 包下载:进入 GitHub Releases 页面,选择对应版本(2.4.0 + 版本为自研引擎):https://github.com/xuxueli/xxl-job/releases
- 推荐下载
xxl-job-admin-${version}.jar(调度中心可直接运行的 JAR 包); - 源码包(
Source code)包含完整项目代码和数据库脚本。
- 推荐下载
注意事项
- 升级后首次启动调度中心时,会自动初始化自研引擎的元数据,无需额外操作;
- 若升级后任务调度异常,优先检查数据库表结构是否正确迁移(尤其是索引和新增字段);
- 生产环境建议先在测试环境验证升级,确认兼容性后再迁移至生产。
--------------------------------------------------------------------------
xxl-job GLUE 多语言支持 执行需要登录么
在 XXL-JOB 中,GLUE 多语言任务的执行过程不需要用户手动登录,但任务的创建、编辑等控制台操作需要登录,且执行过程依赖系统内部的权限校验机制。具体说明如下:
1. GLUE 任务的执行流程
GLUE 任务(无论是 Java、Shell、Python 等语言)的执行是调度中心与执行器之间的自动化交互,流程如下:
- 调度中心根据任务配置(如 Cron 表达式)定时触发任务;
- 调度中心通过 HTTP 协议向执行器发送执行指令(携带任务参数、GLUE 脚本内容等);
- 执行器接收指令后,在本地解析并执行 GLUE 脚本,执行结果回调给调度中心。
整个过程是系统组件间的自动通信,不依赖用户是否登录控制台,只要任务状态为 “运行中”(
trigger_status=1),就会按调度规则自动执行。2. 与登录相关的权限控制
虽然执行过程无需登录,但以下操作需要用户登录控制台并拥有对应权限:
- 创建 / 编辑 GLUE 任务:需登录调度中心控制台,且用户需拥有该执行器分组的操作权限(通过
xxl_job_user表的permission字段控制)。 - 手动触发 GLUE 任务:在控制台手动点击 “执行一次” 时,需登录且有操作权限。
3. 系统间的安全校验(非用户登录)
GLUE 任务执行过程中,调度中心与执行器之间的通信会进行系统级别的安全校验,而非用户登录校验:
- accessToken 校验:若配置了
xxl.job.accessToken(调度中心和执行器需一致),执行器会验证请求中的 Token,防止非法请求。 - 执行器地址合法性:调度中心仅向已注册的执行器(
xxl_job_registry表中有效地址)发送指令,确保执行目标可信。
总结
- 执行阶段:GLUE 多语言任务的自动调度执行无需用户登录,由系统按规则自动触发。
- 管理阶段:创建、编辑、手动触发 GLUE 任务需登录控制台,并依赖用户权限控制。
核心区别:用户登录是针对控制台操作的身份验证,而任务执行是系统组件间的自动化交互,依赖配置的安全机制(如 accessToken)而非用户登录状态。
xxl-job 如何关闭 GLUE 多语言支持
XXL-JOB 的 GLUE 多语言支持(如 Shell、Python、PHP 等)本身没有直接的 “关闭开关”,但可以通过 代码层面的二次开发 限制仅允许特定类型的 GLUE 任务(如仅保留 Java 方法或 Groovy 脚本),从而间接禁用多语言支持。以下是具体实现方式:
核心思路
GLUE 任务的类型由
xxl_job_info 表的 glue_type 字段控制(如 GLUE_SHELL、GLUE_PYTHON 等)。限制多语言支持的本质是:- 禁止在控制台创建非目标类型的 GLUE 任务;
- 拦截调度中心对非目标类型任务的触发请求;
- 执行器拒绝执行非目标类型的 GLUE 任务。
具体实现步骤
步骤 1:限制控制台可选择的 GLUE 类型(前端修改)
调度中心的前端页面(
xxl-job-admin 的前端代码,通常是 Vue 组件)在创建 / 编辑任务时,会展示 GLUE 类型的下拉框。需修改该组件,仅保留允许的类型(如 BEAN、GLUE_JAVA)。- 文件位置(参考 2.4.0+ 版本):
xxl-job-admin/src/main/resources/static/xxl-job-admin-ui/src/views/job/job-form.vue(或类似任务配置页面)。 - 修改内容:
找到 GLUE 类型选择器的选项列表,删除
GLUE_SHELL、GLUE_PYTHON、GLUE_PHP、GLUE_NODEJS等多语言类型,仅保留需要的类型。例如:javascript运行// 原选项(多语言支持) const glueTypeOptions = [ { label: 'BEAN', value: 'BEAN' }, { label: 'GLUE_JAVA', value: 'GLUE_JAVA' }, { label: 'GLUE_SHELL', value: 'GLUE_SHELL' }, { label: 'GLUE_PYTHON', value: 'GLUE_PYTHON' }, // ... 其他类型 ]; // 修改后(仅保留 BEAN 和 GLUE_JAVA) const glueTypeOptions = [ { label: 'BEAN', value: 'BEAN' }, { label: 'GLUE_JAVA', value: 'GLUE_JAVA' } ];
步骤 2:后端拦截非允许的 GLUE 类型(调度中心修改)
即使前端限制了选择,仍可能通过 API 或数据库直接修改
glue_type 字段创建多语言任务。需在调度中心后端添加校验逻辑,拦截非法类型。-
拦截点 1:任务创建 / 更新接口找到任务新增 / 编辑的接口(如
JobInfoController的add或update方法),添加glue_type校验:java运行// 允许的 GLUE 类型列表 private static final List<String> ALLOWED_GLUE_TYPES = Arrays.asList("BEAN", "GLUE_JAVA"); @PostMapping("/add") public ReturnT<String> add(JobInfo jobInfo) { // 校验 GLUE 类型 if (!ALLOWED_GLUE_TYPES.contains(jobInfo.getGlueType())) { return new ReturnT<>(ReturnT.FAIL_CODE, "不支持的 GLUE 类型:" + jobInfo.getGlueType()); } // 原有逻辑... } -
拦截点 2:任务触发前校验在调度中心触发任务前(如
JobTriggerPoolHelper的触发逻辑),检查任务的glue_type,若为非法类型则拒绝触发:java运行public void trigger(int jobId) { JobInfo jobInfo = jobInfoMapper.loadById(jobId); if (jobInfo == null) { return; } // 校验 GLUE 类型 if (!ALLOWED_GLUE_TYPES.contains(jobInfo.getGlueType())) { logger.warn("任务 {} 触发失败:不支持的 GLUE 类型 {}", jobId, jobInfo.getGlueType()); return; } // 原有触发逻辑... }
步骤 3:执行器拒绝非允许的 GLUE 任务(执行器修改)
执行器接收调度中心的任务指令后,会解析并执行 GLUE 脚本。需在执行器中添加校验,拒绝非允许类型的任务。
- 修改执行器核心逻辑(参考
GlueJobHandler或JobExecutor):在执行器处理任务前,检查glueType,若为非法类型则返回失败:java运行public ReturnT<String> execute(TriggerParam triggerParam) throws Exception { String glueType = triggerParam.getGlueType(); // 允许的 GLUE 类型列表(需与调度中心一致) List<String> allowedGlueTypes = Arrays.asList("BEAN", "GLUE_JAVA"); if (!allowedGlueTypes.contains(glueType)) { return new ReturnT<>(ReturnT.FAIL_CODE, "执行器不支持的 GLUE 类型:" + glueType); } // 原有执行逻辑... }
步骤 4:清理历史非法 GLUE 任务(可选)
若数据库中已存在多语言 GLUE 任务(如
glue_type 为 GLUE_SHELL),需手动清理或更新为允许的类型,避免残留任务导致异常:sql
-- 查看所有非法 GLUE 任务
SELECT id, job_group, glue_type FROM xxl_job_info
WHERE glue_type NOT IN ('BEAN', 'GLUE_JAVA');
-- 批量更新为 BEAN 类型(或根据实际需求删除)
UPDATE xxl_job_info
SET glue_type = 'BEAN', glue_source = ''
WHERE glue_type NOT IN ('BEAN', 'GLUE_JAVA');
注意事项
- 兼容性:上述修改属于二次开发,升级 XXL-JOB 版本时需重新适配(需对比新版本代码差异,合并修改)。
- 安全性:限制 GLUE 多语言支持可减少脚本注入风险(如 Shell 脚本的安全隐患),适合对安全性要求较高的场景。
- 最小化原则:若仅需禁用部分类型(如保留 Groovy 但禁用 Shell),只需在上述步骤中调整
ALLOWED_GLUE_TYPES列表即可。
通过以上步骤,可实现对 GLUE 多语言支持的 “关闭”(实际是限制为特定类型),确保系统仅处理允许的 GLUE 任务类型。
xxl-job 如何关闭 GLUE
在 XXL-JOB 中,GLUE(动态脚本任务) 包括
GLUE_JAVA、GLUE_SHELL、GLUE_PYTHON 等类型,与 BEAN 类型(执行器中预定义的 Java 方法)相对。若需完全关闭 GLUE 功能(即只允许 BEAN 类型任务),需从前端限制、后端校验、执行器拦截三个层面阻断 GLUE 任务的创建和执行,具体步骤如下:核心目标
仅允许
glue_type = 'BEAN' 的任务(即通过执行器中 @XxlJob 注解定义的 Java 方法任务),禁止所有 GLUE 类型任务(包括 GLUE_JAVA、GLUE_SHELL 等)的创建、触发和执行。具体实现步骤
步骤 1:前端限制(禁止选择 GLUE 类型)
修改调度中心控制台的任务创建 / 编辑页面,移除所有 GLUE 类型选项,仅保留
BEAN 类型。-
文件位置(以 2.4.0+ 版本为例):调度中心前端代码通常位于
xxl-job-admin/src/main/resources/static/xxl-job-admin-ui/src/views/job/job-form.vue(任务配置表单组件)。 -
修改内容:找到 GLUE 类型选择器的选项列表,仅保留
BEAN类型,删除所有 GLUE 相关选项。例如:javascript运行// 原 GLUE 类型选项(包含 GLUE 和 BEAN) const glueTypeOptions = [ { label: 'BEAN', value: 'BEAN' }, { label: 'GLUE_JAVA', value: 'GLUE_JAVA' }, { label: 'GLUE_SHELL', value: 'GLUE_SHELL' }, { label: 'GLUE_PYTHON', value: 'GLUE_PYTHON' }, // ... 其他 GLUE 类型 ]; // 修改后(仅保留 BEAN) const glueTypeOptions = [ { label: 'BEAN', value: 'BEAN' } ];同时,隐藏 GLUE 脚本编辑区域(如glueSource文本框),因为BEAN类型任务无需脚本内容。
步骤 2:后端校验(拦截 GLUE 任务的创建和触发)
即使前端限制了选择,仍可能通过 API 或直接修改数据库创建 GLUE 任务。需在调度中心后端添加校验,强制
glue_type 必须为 BEAN。-
拦截点 1:任务创建 / 更新接口在
JobInfoController的add(新增)和update(更新)方法中,添加glue_type校验:java运行@PostMapping("/add") public ReturnT<String> add(JobInfo jobInfo) { // 强制校验:仅允许 BEAN 类型 if (!"BEAN".equals(jobInfo.getGlueType())) { return new ReturnT<>(ReturnT.FAIL_CODE, "禁止创建非 BEAN 类型任务(已关闭 GLUE 功能)"); } // 原有业务逻辑(如参数校验、保存到数据库) return jobInfoService.add(jobInfo); } @PostMapping("/update") public ReturnT<String> update(JobInfo jobInfo) { // 同样校验更新操作 if (!"BEAN".equals(jobInfo.getGlueType())) { return new ReturnT<>(ReturnT.FAIL_CODE, "禁止更新为非 BEAN 类型任务(已关闭 GLUE 功能)"); } return jobInfoService.update(jobInfo); } -
拦截点 2:任务触发前校验在调度中心触发任务的核心逻辑中(如
JobTriggerPoolHelper或JobScheduleHelper),检查任务类型,若为 GLUE 类型则拒绝触发:java运行public void trigger(int jobId) { JobInfo jobInfo = jobInfoMapper.loadById(jobId); if (jobInfo == null) { return; } // 触发前校验:仅允许 BEAN 类型任务 if (!"BEAN".equals(jobInfo.getGlueType())) { logger.warn("任务 {} 触发失败:非 BEAN 类型任务(已关闭 GLUE 功能)", jobId); return; } // 原有触发逻辑(如发送执行指令到执行器) }
步骤 3:执行器拦截(拒绝执行 GLUE 任务)
执行器接收调度中心的任务指令后,需额外校验任务类型,若为 GLUE 类型则直接返回失败,避免执行风险。
- 修改执行器核心处理逻辑(如
JobExecutor或GlueJobHandler):在执行器处理任务前,检查glueType,若不是BEAN则拒绝执行:java运行public ReturnT<String> execute(TriggerParam triggerParam) throws Exception { String glueType = triggerParam.getGlueType(); // 执行器仅允许 BEAN 类型任务 if (!"BEAN".equals(glueType)) { return new ReturnT<>(ReturnT.FAIL_CODE, "执行器已关闭 GLUE 功能,仅支持 BEAN 类型任务"); } // 原有执行逻辑(如调用 @XxlJob 注解的方法) return super.execute(triggerParam); }
步骤 4:清理历史 GLUE 任务(可选但推荐)
若数据库中已存在 GLUE 类型任务(
glue_type != 'BEAN'),需手动清理或更新为 BEAN 类型,避免残留任务导致异常:sql
-- 1. 查看所有非 BEAN 类型任务
SELECT id, job_group, job_desc, glue_type FROM xxl_job_info WHERE glue_type != 'BEAN';
-- 2. 批量更新为 BEAN 类型(需确保这些任务实际对应执行器中的 @XxlJob 方法,否则会执行失败)
UPDATE xxl_job_info SET glue_type = 'BEAN', glue_source = '' WHERE glue_type != 'BEAN';
-- 或直接删除(若无需保留)
DELETE FROM xxl_job_info WHERE glue_type != 'BEAN';
注意事项
- 二次开发兼容性:上述修改属于定制化开发,升级 XXL-JOB 版本时需重新适配(需对比新版本代码,合并修改逻辑)。
- 安全性:关闭 GLUE 功能可避免动态脚本注入风险(如 Shell 脚本执行系统命令的安全隐患),适合对安全性要求极高的场景。
- 功能影响:关闭后,所有依赖 GLUE 脚本的任务将无法使用,需确保业务中仅使用
BEAN类型任务(执行器中预定义的 Java 方法)。
通过以上步骤,可彻底关闭 XXL-JOB 的 GLUE 功能,仅保留
BEAN 类型任务的支持,从控制台到执行器全方位限制非必要的动态脚本任务。--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------

浙公网安备 33010602011771号