XXL-JOB v.. | 分布式任务调度平台
XXL-JOB v2.4.1 | 分布式任务调度平台一、从概念开始什么是分布式任务调度在传统的单机应用中我们经常使用cron表达式来定时执行任务比如每天凌晨清理日志、每小时同步一次数据。这种模式在单机环境下运行良好但在分布式系统中却面临诸多挑战单点故障、任务重复执行、无法动态扩展等问题。XXL-JOB是一个轻量级的分布式任务调度平台它的核心目标是解决这些痛点。通过中央调度中心 执行器的架构它能够- 统一管理所有定时任务- 支持动态添加、修改、删除任务- 提供任务失败重试、告警机制- 实现分片广播执行## 二、核心架构调度中心与执行器### 2.1 架构解析XXL-JOB 采用经典的调度中心Admin执行器Executor架构[调度中心] --- 调度请求 --- [执行器集群] ↑ | | ↓ [数据库] [执行具体任务]-调度中心负责任务的调度管理维护 cron 表达式、触发任务执行、记录执行日志。-执行器实际执行任务的微服务实例接收调度中心的指令并执行任务逻辑。### 2.2 为什么需要这种架构举个例子假设我们有 10 台服务器都需要执行“每日数据清洗”任务。如果每台机器都配置一个 cron不仅管理困难还可能导致任务重复执行。而使用 XXL-JOB只需要在调度中心配置一次任务调度中心会智能地选择一台执行器来执行或者使用分片模式让所有执行器分别处理一部分数据。## 三、环境搭建快速上手### 3.1 调度中心部署首先我们需要部署调度中心。最简单的方式是使用官方提供的 Docker 镜像bash# 拉取镜像docker pull xuxueli/xxl-job-admin:2.4.1# 启动容器注意替换数据库连接信息docker run -d \ -p 8080:8080 \ -e PARAMS--spring.datasource.urljdbc:mysql://localhost:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai \ --spring.datasource.usernameroot \ --spring.datasource.password123456 \ --name xxl-job-admin \ xuxueli/xxl-job-admin:2.4.1启动后访问http://localhost:8080/xxl-job-admin默认账号密码admin/123456。### 3.2 创建数据库表调度中心需要数据库来存储任务配置和执行日志。执行以下 SQL 创建表结构部分核心表sql-- 任务信息表CREATE TABLE xxl_job_info ( id int(11) NOT NULL AUTO_INCREMENT, job_group int(11) NOT NULL COMMENT 执行器主键ID, job_cron varchar(128) NOT NULL COMMENT 任务执行CRON表达式, 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 报警邮件, executor_handler varchar(255) DEFAULT NULL COMMENT 执行器任务handler, executor_param varchar(512) DEFAULT NULL COMMENT 执行器任务参数, PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4;## 四、Java 代码实战编写执行器### 4.1 Maven 依赖在你的 Spring Boot 项目中添加依赖xmldependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId version2.4.1/version/dependency### 4.2 配置执行器在application.properties中添加配置properties# 执行器配置xxl.job.admin.addresseshttp://localhost:8080/xxl-job-adminxxl.job.accessTokendefault_tokenxxl.job.executor.appnamemy-executor-appxxl.job.executor.ipxxl.job.executor.port9999xxl.job.executor.logpath/data/applogs/xxl-job/jobhandlerxxl.job.executor.logretentiondays30### 4.3 编写第一个任务代码示例下面是一个完整的任务示例我们创建一个简单的“数据同步”任务javaimport com.xxl.job.core.context.XxlJobHelper;import com.xxl.job.core.handler.annotation.XxlJob;import org.springframework.stereotype.Component;Componentpublic class MyJobHandler { /** * 数据同步任务 * 每小时执行一次同步订单数据 */ XxlJob(syncOrderData) public void syncOrderData() { // 获取任务参数可在调度中心配置 String param XxlJobHelper.getJobParam(); XxlJobHelper.log(数据同步任务开始参数{}, param); try { // 模拟同步过程 int totalRecords 1000; for (int i 0; i totalRecords; i) { // 模拟每条记录的处理 Thread.sleep(10); // 实际业务中这里是数据库操作 if (i % 100 0) { XxlJobHelper.log(已同步 {} 条记录, i); } } XxlJobHelper.log(数据同步完成共处理 {} 条记录, totalRecords); XxlJobHelper.handleSuccess(同步成功); } catch (Exception e) { XxlJobHelper.log(数据同步失败{}, e.getMessage()); XxlJobHelper.handleFail(同步异常); } } /** * 分片任务示例 * 由调度中心分发给多个执行器并行处理 */ XxlJob(shardingJob) public void shardingJob() { // 获取分片信息 int shardIndex XxlJobHelper.getShardIndex(); // 当前分片序号0开始 int shardTotal XxlJobHelper.getShardTotal(); // 总分片数 XxlJobHelper.log(分片任务执行分片序号{}/{}, shardIndex, shardTotal); // 假设有10000条数据需要处理每个分片处理一部分 int totalData 10000; int batchSize totalData / shardTotal; int start shardIndex * batchSize; int end (shardIndex shardTotal - 1) ? totalData : (shardIndex 1) * batchSize; for (int i start; i end; i) { // 处理数据 i XxlJobHelper.log(分片{}处理数据{}, shardIndex, i); } }}## 五、高级特性分片广播与动态配置### 5.1 分片广播原理分片是 XXL-JOB 最强大的特性之一。当任务配置为“分片广播”时调度中心会将任务同时派发给所有执行器每个执行器会获得不同的分片序号。这特别适合以下场景-大数据批量处理10 台机器各自处理 1/10 的数据-并行抓取每台机器抓取不同网站的页面-负载均衡避免单点瓶颈### 5.2 动态任务配置在实际生产环境中我们经常需要动态调整任务。XXL-JOB 提供了完整的 API 来管理任务javaimport com.xxl.job.core.biz.model.ReturnT;import com.xxl.job.core.handler.annotation.XxlJob;import com.xxl.job.core.util.ShardingUtil;import org.springframework.stereotype.Component;Componentpublic class DynamicTaskHandler { /** * 动态参数任务 * 通过调度中心实时修改任务参数 */ XxlJob(dynamicParamJob) public void dynamicParamJob() { // 获取动态参数JSON格式 String param XxlJobHelper.getJobParam(); if (param ! null !param.isEmpty()) { // 解析参数例如{targetUrl:http://example.com,timeout:5000} XxlJobHelper.log(使用动态参数{}, param); // 根据参数执行不同的逻辑 if (param.contains(targetUrl)) { // 执行网络请求 XxlJobHelper.log(开始网络请求任务); } else { // 执行其他任务 XxlJobHelper.log(执行默认任务); } } else { XxlJobHelper.log(使用默认参数执行任务); } // 模拟任务耗时 try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } XxlJobHelper.handleSuccess(动态参数任务执行完成); }}## 六、任务配置与监控### 6.1 在调度中心配置任务通过调度中心 Web 界面我们可以很方便地配置任务1. 登录调度中心2. 进入“任务管理” - “新增任务”3. 配置任务信息 -执行器选择我们刚刚注册的my-executor-app-JobHandler填写syncOrderData对应代码中的XxlJob注解值 -Cron0 0 * * * ?每小时执行一次 -运行模式选择“Bean模式”4. 保存并启动任务### 6.2 监控与告警调度中心提供丰富的监控功能-执行日志可以查看每次任务的详细执行日志-失败告警配置邮件告警任务失败时自动通知-调度统计查看任务执行次数、成功率等统计信息## 七、总结XXL-JOB 作为一个成熟的分布式任务调度平台以其轻量级、易扩展、功能丰富的特点成为 Java 生态中的首选方案。通过本文的学习我们掌握了1.核心概念理解了调度中心与执行器的架构设计2.环境搭建学会了快速部署调度中心3.代码实践编写了包含分片和动态参数的任务示例4.高级特性掌握了分片广播和动态配置的使用方法在实际项目中XXL-JOB 可以轻松应对各种定时任务场景从简单的定时通知到复杂的大数据分片处理。通过结合 Spring Boot 和 Docker我们可以快速构建一个稳定可靠的分布式任务调度系统。最后建议读者在测试环境中亲手实践一下从创建第一个简单的任务开始逐步探索分片、动态参数等高级功能这样才能真正掌握 XXL-JOB 的强大能力。

相关新闻

FPGA校内实验全流程指南:从环境配置到硬件调试

FPGA校内实验全流程指南:从环境配置到硬件调试

这次我们来聚焦FPGA的校内实操环节。对于电子工程、计算机硬件等相关专业的学生来说,FPGA实验是连接理论知识与工程实践的关键桥梁。无论是完成课程设计、备战学科竞赛,还是为未来的项目开发打下基础,掌握一套清晰、可复现的FPGA实操流程都至…

2026/10/27 12:02:14 阅读更多 →
DCS World插件优化:Tactical Bridge V1.2告警系统配置指南

DCS World插件优化:Tactical Bridge V1.2告警系统配置指南

在 DCS World 这类高拟真度的飞行模拟游戏中,飞行员对战场态势的感知能力直接决定了任务成败。告警系统作为座舱内最重要的信息源之一,其信息呈现的清晰度、优先级判断的准确性和信息组织的逻辑性,是区分普通玩家和专业虚拟飞行员的关键。DCS…

2026/10/28 14:23:36 阅读更多 →
WeChatExporter终极指南:3步轻松备份微信聊天记录到电脑

WeChatExporter终极指南:3步轻松备份微信聊天记录到电脑

WeChatExporter终极指南:3步轻松备份微信聊天记录到电脑 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 还在为丢失重要聊天记录而烦恼吗?微信聊天…

2026/10/26 14:02:45 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/28 9:02:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/28 9:00:54 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 9:01:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →