掌握XXL-JOB:快速搭建高效任务调度系统

server/2025/3/31 6:01:49/

一、前言

定时任务作为自动化执行的核心机制,指系统按预设时间或周期触发特定操作,广泛应用于数据同步(如每日报表生成)、状态更新(如订单超时关闭)等场景。

分布式架构与微服务盛行的当下,任务调度已成为系统稳定性的关键挑战。传统定时任务常面临单点故障、执行混乱、运维复杂等痛点,而xxl-job作为一款轻量级分布式任务调度框架,凭借其开箱即用的设计理念与高可靠性,迅速成为开发者解决复杂调度场景的利器。

自2015年开源以来,xxl-job历经数十个版本迭代,以可视化管理、动态分片、故障转移等核心特性,支撑了电商、金融、物流等领域的海量任务调度需求。本文将从技术演进、功能亮点到实战部署,带您深入解析xxl-job如何以“简单高效”重塑任务调度逻辑,并附赠完整Demo助力快速落地。

image

二、关于XXL-JOB

2.1 简介

XXL-JOB 是一款开源的分布式任务调度平台,由国内开发者许雪里(代码中常用“许雪里”或“XXL”代称)于2015年创建并维护。其核心目标是解决企业级应用中定时任务、周期性任务和分布式任务调度的管理难题,通过统一调度中心实现任务的动态管理、监控和高效执行。它采用“调度中心”与“执行器”分离的设计架构,支持高可用、弹性扩容和可视化操作,广泛应用于各类业务场景。

image

官网:分布式任务调度平台XXL-JOB https://www.xuxueli.com/xxl-job/

image

2.2 发展

  • 2015年:项目开源,初期聚焦基础任务调度功能。
  • 2018年:推出2.0版本,增强分布式支持,优化调度策略和性能。
  • 2020年:发布2.2.0版本,支持分片广播、故障转移、任务依赖等高级功能。
  • 2022年后:持续迭代,新增跨语言、云原生适配等特性,社区生态逐步完善。
    截至当前,XXL-JOB在GitHub已收获超20k+ Star,成为国内最活跃的任务调度框架之一。

2.3 特点

  1. 轻量级与易扩展

    • 核心模块精简,依赖少,可快速集成到Spring Boot等主流框架。
    • 支持自定义任务处理器,灵活适配业务需求。
  2. 分布式与高可用

    • 调度中心和执行器均支持集群部署,避免单点故障。
    • 任务分片机制:将大任务拆分为多个子任务,并行执行提升效率。
  3. 可视化控制台

    • Web界面提供任务管理、日志监控、运行报表等功能,降低运维成本。
    • 支持动态修改任务参数(如CRON表达式),实时生效。
  4. 丰富的路由策略

    • 提供轮询、故障转移、分片广播、一致性哈希等10+种路由策略,适配不同场景。
  5. 容错与报警机制

    • 自动重试失败任务,支持邮件、钉钉、Webhook等多渠道报警通知。
    • 记录完整执行日志,便于问题追踪。
  6. 跨语言支持

    • 执行器可通过HTTP、gRPC等协议接入,支持Java、Python、Go等多语言任务。

2.4 应用场景

  1. 定时任务管理

    • 示例:每日凌晨统计报表生成、每小时清理日志文件、每周数据归档。
  2. 分布式计算

    • 大数据处理时,通过任务分片并行执行(如批量用户画像分析)。
  3. 异步任务解耦

    • 将耗时操作(如发送短信、邮件)异步化,提升系统响应速度。
  4. 系统巡检与监控

    • 定时检查服务健康状态(如数据库连接、API可用性)。
  5. 任务依赖与流水线

    • 实现任务链式触发(如A任务完成后自动触发B任务)。
  6. 微服务场景

    • 跨服务协调任务,如订单超时关闭、库存同步等。

三、XX-JOB下载部署

3.1 IDEA下载项目源码

XXL-JOB源码仓库地址:https://gitee.com/xuxueli0323/xxl-job

复制项目下载路径

image

image

IDEA中新建项目,选择Get from vcs

image

复制项目下载路径,并指定项目存放目录

image

image

3.2 打开项目

image

maven会下载项目所需要的依赖包

image

备注:如果下载比较慢,修改maven的镜像源,推荐阿里云镜像源(具体配置可私信)

image

配置后,重新reload

image

比较快下载好依赖包

image

3.3 初始化数据库

复制db下的sql文件,到Dbeaver

image

#
# XXL-JOB
# 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 = InnoDBDEFAULT 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`),KEY `I_jobid_jobgroup` (`job_id`,`job_group`),KEY `I_job_id` (`job_id`)
) ENGINE = InnoDBDEFAULT 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 = InnoDBDEFAULT 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 = InnoDBDEFAULT 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`),UNIQUE KEY `i_g_k_v` (`registry_group`, `registry_key`, `registry_value`) USING BTREE
) ENGINE = InnoDBDEFAULT 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 = InnoDBDEFAULT 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 = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_lock`
(`lock_name` varchar(50) NOT NULL COMMENT '锁名称',PRIMARY KEY (`lock_name`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;## —————————————————————— init data ——————————————————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;

执行后,生成库表

image

image

image

3.4 修改项目配置文件

修改项目连接数据库的账号,密码

image

3.5 启动项目

image

image

3.6 浏览器访问

http://127.0.0.1:8080/xxl-job-admin/

image

默认账号密码
admin
123456

image

3.7 配置执行器

把本地执行器注册到平台

image

名称自定义

image

执行器端口查看

image

配置好后

image

四、第一个定时任务

4.1 编写任务

这里使用最简单的注解方式来执行定时任务

image

java">    @XxlJob("test02")public void test() {logger.info("test02执行成功!执行时间:"+new Date());System.out.println("技海拾贝的定时任务完成,可以执行其它操作");}

4.2 配置任务

image

image

image

4.3 重启任务服务

image

4.4 点击执行一次

image

查看调度日志

image

image

此时在idea的控制台会有输出

image

4.5 任务启动

启动后,就会按设置时间执行

image

这里配置每秒执行一次,可以看到在执行

image

XXL-Job 作为一款卓越的分布式任务调度平台,在任务调度领域展现了强大的实力和广泛的应用价值。通过本文的介绍,相信大家对 XXL-Job 的发展、特点、应用场景、下载安装及演示 demo 等方面有了全面的了解。

在数字化不断推进的今天,XXL-Job 必将为越来越多的企业和开发者提供高效、稳定、灵活的任务调度解决方案,助力项目成功实施和稳定运行。希望本文能成为你深入了解和使用 XXL-Job 的有益参考,开启高效任务调度的新篇章。

点击关注收藏


http://www.ppmy.cn/server/178663.html

相关文章

vscode python 入门教程(二) vscode使用gti 管理代码

vscode 代码管理需要用管道git的命令,这点和idea的代码管理区别比较大。 作为java开发需要自己熟悉适应一下。 一、GitHub 新建一个仓库 过程略 二、本地git 项目初始化 git initvscode 中可以看到 文件状态 git status使用git remote 命令吧本地git 仓库和远程…

本地部署 Firecrawl

本地部署 Firecrawl 本文档概述了如何本地部署 Firecrawl。 为什么要本地部署? 增强安全性和合规性: 数据处理和存储完全在您的控制之下,符合内部和外部法规。Firecrawl 作为 Mendable 产品,依赖于 SOC2 Type2 认证,…

2025年渗透测试面试题总结-某深信服 -安全工程师(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 深信服 -安全工程师 一、宽字节注入原理与编码影响 (一)技术原理 &#xff08…

基于AWS Endpoint Security(EPS)的全天候威胁检测与响应闭环管理

设计AWS云架构方案实现基于AWS Endpoint Security(EPS)的全天候威胁检测与响应,使用EPS通过代理实时监控终端进程、网络连接等行为,例如检测异常登录尝试或恶意软件活动。一旦发现威胁,系统会自动生成安全事件工单并触发响应流程,…

Js闭包Closure 及 其可能产生的内存泄漏问题

闭包的主要作用:实现数据私有,函数内定义的私有变量,外面可以使用访问,但不可以修改。 以统计调用次数的函数为例: 普通形式: let a 0;function fn() {a;console.log(a: ${a});} 闭包形式: …

批量给 PPT 幻灯片页面添加文字和图片水印

给 PPT 文档添加水印是非常常见的一个操作,不仅可以保护我们的版权,也可以起到很好的宣传作用。那如何给 PPT 文档地幻灯片页面添加水印呢?如何添加文字水印或者图片水印呢?今天就给大家介绍一种批量给 PPT 添加水印的方法。 在网…

【C++初阶】从零开始模拟实现vector(含迭代器失效详细讲解)

目录 1、基本结构 1.1成员变量 1.2无参构造函数 1.3有参构造函数 preserve()的实现 代码部分: push_back()的实现 代码部分: 代码部分: 1.4拷贝构造函数 代码部分: 1.5支持{}初始化的构造函数 代码部分: …

在ASP.NET Core中使用NLog:配置与性能优化指南

在ASP.NET Core中使用NLog:配置与性能优化指南 在ASP.NET Core中使用NLog:配置与性能优化指南1. 安装NLog包2. 基础配置2.1 创建nlog.config文件2.2 程序启动配置 3. 在代码中使用日志4. 性能优化配置4.1 异步日志处理4.2 自动清理旧日志4.3 缓冲写入优化…