xxl-job 数据库表详解

--------------------------------------------------------------------------

XXL-JOB 的数据库表设计围绕分布式任务调度的核心功能展开,主要包括任务配置、执行器管理、日志记录、状态监控等模块。以下是核心表的详细解析(基于 2.4.0+ 版本):

一、核心配置表

1. xxl_job_group - 执行器分组表

  • 作用:管理任务执行器(Executor)的分组信息,支持按业务维度隔离任务。
  • 关键字段:
    字段名类型说明
    id int(11) 主键 ID
    app_name varchar(64) 执行器的应用名称(用于自动注册时的分组标识)
    title varchar(64) 执行器的显示名称(控制台展示)
    address_type int(4) 执行器地址类型:
     
    0 - 自动注册(执行器主动上报地址)
     
    1 - 手动录入地址列表
    address_list varchar(512) 执行器地址列表(手动录入时使用,格式:IP1:PORT,IP2:PORT
  • 关联关系:xxl_job_info 通过 job_group 字段关联执行器分组。

2. xxl_job_info - 任务信息表

  • 作用:存储所有任务的元数据配置,包括调度策略、执行逻辑、报警规则等。
  • 关键字段:
    字段名类型说明
    id int(11) 任务 ID
    job_group int(11) 执行器分组 ID(关联 xxl_job_group
    schedule_type varchar(50) 调度类型:
     
    CRON - Cron 表达式
     
    FIX_RATE - 固定频率(毫秒)
     
    FIX_DELAY - 固定延迟(毫秒)
    schedule_conf varchar(128) 调度配置:
     
    对 CRON 是 Cron 表达式,对 FIX_RATE 是间隔时间
    executor_route_strategy varchar(50) 执行器路由策略:
     
    FIRST - 第一个存活实例
     
    ROUND - 轮询
     
    RANDOM - 随机
    executor_handler varchar(255) 执行器任务处理器名称(对应 @XxlJob 注解的 value)
    glue_type varchar(50) 任务类型:
     
    BEAN - Java 方法
     
    GLUE_GROOVY - Groovy 脚本
    trigger_status tinyint(4) 任务状态:
     
    0 - 停止
     
    1 - 运行
    trigger_last_time bigint(13) 上次触发时间(时间戳,毫秒)
    trigger_next_time bigint(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 - 任务日志表

  • 作用:记录任务执行的详细日志,包括触发结果、执行耗时、异常信息等。
  • 关键字段:
    字段名类型说明
    id bigint(20) 日志 ID
    job_id int(11) 关联的任务 ID(对应 xxl_job_info.id
    trigger_time datetime 任务触发时间
    trigger_code int(11) 触发状态码:
     
    200 - 成功
     
    500 - 失败
    handle_time datetime 任务开始执行时间
    handle_code int(11) 执行状态码:
     
    200 - 成功
     
    500 - 失败
     
    0 - 执行中
    alarm_status tinyint(4) 告警状态:
     
    0 - 未告警
     
    1 - 无需告警
     
    2 - 告警成功
     
    3 - 告警失败
  • 关联关系:通过 job_id 关联 xxl_job_info,通过 executor_address 关联执行器实例。

4. xxl_job_log_report - 日志报表表

  • 作用:按天统计任务执行情况,用于控制台报表展示。
  • 关键字段:
    字段名类型说明
    id int(11) 报表 ID
    trigger_day datetime 统计日期(精确到天)
    suc_count int(11) 当天成功任务数
    fail_count int(11) 当天失败任务数
  • 数据更新:调度中心每分钟自动统计前一天的日志数据。

三、动态注册与锁表

5. xxl_job_registry - 执行器注册表

  • 作用:存储执行器和调度中心的动态注册信息,实现执行器地址的自动发现。
  • 关键字段:
    字段名类型说明
    registry_group varchar(50) 注册类型:
     
    EXECUTOR - 执行器
     
    ADMIN - 调度中心
    registry_key varchar(255) 注册键(对 EXECUTOR 是 app_name,对 ADMIN 是调度中心地址)
    registry_value varchar(255) 注册值(执行器的地址或调度中心的地址)
  • 机制:
    • 执行器启动后向调度中心注册地址,调度中心每 30 秒清理超时 90 秒未心跳的执行器。
    • 调度中心根据 registry_value 动态维护可用执行器列表。

6. xxl_job_lock - 任务锁表

  • 作用:通过数据库行锁实现分布式任务调度的并发控制。
  • 关键字段:
    字段名类型说明
    lock_name varchar(50) 锁名称:
     
    schedule_lock - 全局调度锁
     
    state_access - 任务状态锁
  • 示例:
    • 调度中心触发任务时,通过 state_access 锁确保同一任务不会被多个线程重复触发。
    • 执行器回调更新任务状态时,需获取 state_access 锁保证原子性。

四、系统与扩展表

7. xxl_job_user - 用户表

  • 作用:存储平台用户信息,支持权限管理。
  • 关键字段:
    字段名类型说明
    username varchar(50) 用户名(唯一)
    password varchar(50) 密码(MD5 加密)
    role tinyint(4) 角色:
     
    0 - 普通用户
     
    1 - 管理员
    permission varchar(255) 权限(执行器 ID 列表,逗号分隔)

8. xxl_job_logglue - GLUE 日志表

  • 作用:存储 GLUE 脚本的历史版本,支持版本回溯。
  • 关键字段:
    字段名类型说明
    job_id int(11) 关联的任务 ID
    glue_source mediumtext GLUE 脚本内容
    glue_updatetime datetime 脚本更新时间

五、表间关系与核心流程

  1. 任务注册:
    • 用户在控制台创建任务,数据写入 xxl_job_info,关联 xxl_job_group 中的执行器分组。
    • 执行器启动后向 xxl_job_registry 表注册地址,调度中心自动发现可用执行器。
  2. 任务触发:
    • 调度中心扫描 xxl_job_info 中 trigger_next_time <= 当前时间 的任务。
    • 获取 xxl_job_lock 锁后,更新任务状态并记录日志到 xxl_job_log
  3. 任务执行:
    • 调度中心通过 xxl_job_registry 获取执行器地址,调用执行器接口。
    • 执行器执行任务后,回调调度中心更新 xxl_job_log 中的 handle_code 和 handle_msg
  4. 日志与监控:
    • xxl_job_log 记录每次执行的详细信息,xxl_job_log_report 按天统计执行结果。
    • 控制台通过查询这些表展示任务状态、执行趋势等信息。

六、注意事项

  1. 版本差异:
    • 2.3.0 及之前版本包含 xxl_job_qrtz_xxx 表(基于 Quartz 调度),2.4.0+ 版本已将其功能整合到 xxl_job_info 表。
  2. 性能优化:
    • xxl_job_log 表数据量可能快速增长,建议定期清理历史日志(通过配置 xxl.job.logretentiondays 自动清理)。
  3. 分布式锁机制:
    • xxl_job_lock 表依赖数据库行锁,在高并发场景下可能成为性能瓶颈,需根据实际情况评估是否替换为 Redis 等分布式锁。
通过以上表结构,可深入理解 XXL-JOB 的任务调度、执行、监控等核心功能,为系统运维和二次开发提供数据层面的支持。

--------------------------------------------------------------------------

XXL-JOB 各版本在功能、架构和稳定性上持续迭代,以下是核心版本的关键区别:

一、2.3.0 版本(2022 年)

核心改进:
  1. 调度过期策略
     
    新增「忽略」或「立即补偿触发一次」策略,解决调度中心因延迟导致的任务漏触发问题。
  2. 触发方式扩展
     
    除 Cron 外,新增「固定间隔触发」和实验性「固定延时触发」,支持更灵活的任务调度场景。
  3. 任务辅助工具
     
    引入 XxlJobHelper,统一提供任务参数获取、日志输出、分片参数解析等能力,简化开发流程。
  4. 执行器注册优化
     
    注册逻辑改为异步方式,提升高并发场景下的注册性能;新增 accessToken 校验,增强安全性。
  5. Cron 编辑器增强
     
    支持实时预览最近运行时间,修复小概率字段重置问题,提升配置体验。
  6. 数据库适配
     
    优化 Oracle 数据库兼容性,调整 SQL 语法和分页查询逻辑。

二、2.4.0 版本(2023 年)

架构与功能重大升级:
  1. 移除 Quartz 依赖
     
    彻底废弃 Quartz 调度引擎,自研轻量级调度模块,大幅简化数据库表结构(移除 xxl_job_qrtz_xxx 表),提升调度性能和稳定性。
  2. 任务分片与广播
     
    支持分布式任务分片(Sharding),可将大数据量任务拆分为多个子任务并行执行;新增「广播任务」模式,所有执行器同时执行同一任务。
  3. GLUE 脚本增强
     
    支持 Java、Shell、Python、PHP、NodeJS 等多语言脚本,任务逻辑可直接在控制台编辑并动态生效,无需重启应用。
  4. 执行器注册机制
     
    执行器通过 HTTP 接口自动注册到调度中心,支持动态扩缩容和故障转移,替代传统数据库表注册方式。
  5. 权限控制优化
     
    新增用户角色管理(管理员、普通用户),支持按执行器分组配置权限,实现精细化操作控制。
  6. 高可用与安全
     
    调度中心集群部署支持自动选举主节点;修复 SSRF、XSS 等安全漏洞,但早期版本(如 2.4.0)仍存在权限绕过风险,需及时升级至 2.4.1+。

三、2.5.0 版本(2025 年)

性能与稳定性优化:
  1. 线程池与队列优化
     
    调整快慢线程池拒绝策略,避免任务积压导致的结果丢失;优化队列长度,提升突发流量处理能力。
  2. 日志表索引优化
     
    对 xxl_job_log 表添加复合索引,显著提升大日志量场景下的查询和清理速度。
  3. 执行器注册重构
     
    降低多调度中心地址时的并发注册冲突,新增唯一索引防止冗余数据。
  4. 依赖升级
     
    更新 Netty、Slf4j 等基础组件至最新稳定版本,提升框架兼容性和安全性。
  5. 长期维护支持
     
    作为 JDK 8 最后一个大版本,提供长期漏洞修复和性能优化。

四、各版本核心功能对比表

功能特性2.3.0 及以下2.4.0+2.5.0+
调度引擎 Quartz 自研 自研
任务分片与广播
GLUE 多语言支持 有限(Java)
执行器自动注册 数据库表 HTTP HTTP
权限控制 基础 角色管理 角色管理
日志表索引优化
高可用机制 数据库锁 集群选举 集群选举
安全漏洞修复 部分 持续 持续

五、升级建议

  1. 2.3.x → 2.4.x
    • 需手动迁移数据库表结构(移除 Quartz 相关表,新增 xxl_job_log 分片字段)。
    • 执行器配置需调整注册方式(HTTP 接口替代数据库表)。
    • 建议直接升级至 2.4.1+ 以规避 SSRF 等安全风险。
  2. 2.4.x → 2.5.x
    • 数据模型和通讯协议兼容,可无缝升级。
    • 建议同步优化 xxl_job_log 表索引以提升性能。
  3. 长期维护选择
    • 优先使用 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_infoxxl_job_log等核心表),避免升级过程中数据丢失。
  • 查看官方升级文档:参考对应版本的 Release Notes(如2.4.0 Release),确认兼容性注意事项。

3. 数据库表结构迁移(核心步骤)

2.4.0 + 版本移除了 Quartz 相关表(如xxl_job_qrtz_triggerxxl_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 + 版本移除了 Quartz 相关配置(如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(参考官方示例)。

6. 验证升级结果

  • 启动调度中心和执行器,确认无报错;
  • 在调度中心控制台查看任务列表,确认历史任务配置已迁移;
  • 手动触发一个任务,检查xxl_job_log表是否正常记录日志,验证调度引擎工作正常。

二、XXL-JOB 下载地址

XXL-JOB 的官方下载渠道为 GitHub,支持源码下载和 RELEASE 包下载:
  1. 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_SHELLGLUE_PYTHON 等)。限制多语言支持的本质是:
  1. 禁止在控制台创建非目标类型的 GLUE 任务;
  2. 拦截调度中心对非目标类型任务的触发请求;
  3. 执行器拒绝执行非目标类型的 GLUE 任务。

具体实现步骤

步骤 1:限制控制台可选择的 GLUE 类型(前端修改)

调度中心的前端页面(xxl-job-admin 的前端代码,通常是 Vue 组件)在创建 / 编辑任务时,会展示 GLUE 类型的下拉框。需修改该组件,仅保留允许的类型(如 BEANGLUE_JAVA)。
  • 文件位置(参考 2.4.0+ 版本):
     
    xxl-job-admin/src/main/resources/static/xxl-job-admin-ui/src/views/job/job-form.vue(或类似任务配置页面)。
  • 修改内容:
     
    找到 GLUE 类型选择器的选项列表,删除 GLUE_SHELLGLUE_PYTHONGLUE_PHPGLUE_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');
 

注意事项

  1. 兼容性:上述修改属于二次开发,升级 XXL-JOB 版本时需重新适配(需对比新版本代码差异,合并修改)。
  2. 安全性:限制 GLUE 多语言支持可减少脚本注入风险(如 Shell 脚本的安全隐患),适合对安全性要求较高的场景。
  3. 最小化原则:若仅需禁用部分类型(如保留 Groovy 但禁用 Shell),只需在上述步骤中调整 ALLOWED_GLUE_TYPES 列表即可。
通过以上步骤,可实现对 GLUE 多语言支持的 “关闭”(实际是限制为特定类型),确保系统仅处理允许的 GLUE 任务类型。
 
xxl-job 如何关闭 GLUE
 
在 XXL-JOB 中,GLUE(动态脚本任务) 包括 GLUE_JAVAGLUE_SHELLGLUE_PYTHON 等类型,与 BEAN 类型(执行器中预定义的 Java 方法)相对。若需完全关闭 GLUE 功能(即只允许 BEAN 类型任务),需从前端限制、后端校验、执行器拦截三个层面阻断 GLUE 任务的创建和执行,具体步骤如下:

核心目标

仅允许 glue_type = 'BEAN' 的任务(即通过执行器中 @XxlJob 注解定义的 Java 方法任务),禁止所有 GLUE 类型任务(包括 GLUE_JAVAGLUE_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';
 

注意事项

  1. 二次开发兼容性:上述修改属于定制化开发,升级 XXL-JOB 版本时需重新适配(需对比新版本代码,合并修改逻辑)。
  2. 安全性:关闭 GLUE 功能可避免动态脚本注入风险(如 Shell 脚本执行系统命令的安全隐患),适合对安全性要求极高的场景。
  3. 功能影响:关闭后,所有依赖 GLUE 脚本的任务将无法使用,需确保业务中仅使用 BEAN 类型任务(执行器中预定义的 Java 方法)。
通过以上步骤,可彻底关闭 XXL-JOB 的 GLUE 功能,仅保留 BEAN 类型任务的支持,从控制台到执行器全方位限制非必要的动态脚本任务。

--------------------------------------------------------------------------

--------------------------------------------------------------------------

--------------------------------------------------------------------------

--------------------------------------------------------------------------

 

posted @ 2025-10-24 10:34  hanease  阅读(11)  评论(0)    收藏  举报