xxl-job 分布式调度开源系统
什么是xxl-jobxxl-job 项目是分布式调度开源系统具有开发迅速、学习简单、轻量级、易扩展等核心设计目标。安装xxl-job获取源码git clone gitgithub.com:xuxueli/xxl-job.git构建工程进入工程目录使用mvn命令构建工程cd xxl-job mvn package构建过程中会下载所需要的jar包。修改配置文件​在IDEA中打开工程需要修改logback.xml和properties中的日志路径。具体修改方法可以参考XXL-JOB的官方文档。初始化数据库运行以下命令初始化数据库source /xxl-job/doc/db/tables_xxl_job.sql同时需要修改application.properties中的数据库用户密码。具体修改方法可以参考XXL-JOB的官方文档。运行web工程在IDEA中运行web工程访问地址为http://localhost:8080/xxl-job-adm。以上是XXL-JOB的安装和配置过程。在实际应用中还需要根据具体需求进行进一步的配置和优化。同时建议参考XXL-JOB的官方文档和社区资源以便更好地了解和使用XXL-JOB平台。其他项目引入XXL-JOB导入依赖配置执行器dependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId /dependency配置文件配置xxl: job: admin: addresses: http://localhost:8080/xxl-job-admin executor: appname: bill #执行器名字(很重要在调度中心要用到) address: ip: port: 9999 #执行器端口号 logpath: /data/applogs/xxl-job/jobhandler logretentiondays: 30 accessToken: default_token主要就是xxl.job.admin.addresses和xxl.job.executor.appname这俩第一个必须指向正确的调度中心地址。修改xxl-job-admin配置文件application.properties中xxl.job.accessToken的token值默认值为default_token后台配置执行器配置xxl-job的配置类package com.hworld.custom.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; /** * p * xxl-job 配置类 通过配置 xxl.job.enabled 控制是否启用XXL-JOB功能 * /p * * author : hudy * date : 2023/11/20 */ Configuration Slf4j ConditionalOnProperty(name xxl.job.enabled, havingValue true, matchIfMissing false) public class XxlJobConfig { Value(${xxl.job.admin.addresses}) private String adminAddresses; Value(${xxl.job.executor.appname}) private String appName; Value(${xxl.job.executor.port}) private int port; Value(${xxl.job.accessToken}) private String accessToken; Value(${xxl.job.executor.logpath}) private String logPath; Value(${xxl.job.executor.logretentiondays}) private int logRetentionDays; Bean Profile({local, prod}) public XxlJobSpringExecutor xxlJobExecutor() { log.info( xxl-job config init.); XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appName); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }项目配置正确服务自动注册会将项目地址自动注册到Online机器地址。并且其他项目服务日志有这样就是直接使用XxlJob注解了关于XXL-JOB一、基本组成XXL-JOB主要由调度中心和执行器两部分组成调度中心统一管理任务调度平台上的调度任务负责触发调度执行并且提供任务管理平台。它主要负责管理调度信息按照调度配置发出调度请求但自身不承担业务代码。执行器接收调度中心的调度并且执行可以直接执行也可以集成到项目中。它负责接收调度请求并执行任务逻辑包括执行请求、终止请求和日志请求等。二、特点与优势简单易用XXL-JOB提供了友好的Web界面支持通过Web界面进行任务的增删改查同时也支持通过API接口进行任务管理。用户可以通过简单的操作完成任务的调度和管理。动态管理支持动态修改任务状态、启动/停止任务以及终止运行中任务所有操作都会实时生效。高可用性调度中心和执行器都支持集群部署可保证调度和执行的高可用性。即使某个节点出现故障也能自动切换到其他节点继续执行任务。弹性扩容缩容一旦有新执行器机器上线或者下线下次调度时将会重新分配任务实现弹性扩容缩容。丰富的路由策略执行器集群部署时提供多种路由策略包括第一个、最后一个、轮询、随机、一致性HASH等以满足不同场景下的需求。故障转移如果执行器集群中某一台机器故障将会自动Failover切换到一台正常的执行器发送调度请求确保任务能够正常执行。执行失败查看日志对于执行失败的任务可以查看详细的日志信息方便用户进行问题排查和修复。支持邮件报警当任务执行失败时XXL-JOB支持发送邮件通知相关人员以便及时处理异常情况。三、应用场景XXL-JOB适用于各种需要定时执行任务或实时处理任务的场景如定时发送邮件通过XXL-JOB可以定时发送邮件通知相关人员。定时生成报表可以定时生成各类业务报表供相关人员进行分析和决策。定时清理数据可以定时清理过期或无效的数据确保数据库的整洁和高效运行。实时数据采集可以实时采集各类业务数据并进行处理和分析。实时消息推送可以实时推送各类业务消息给用户或第三方系统。四、与其他任务调度框架的比较与Quartz等传统的任务调度框架相比XXL-JOB具有以下优势学习成本低XXL-JOB提供了可视化的Web界面和丰富的文档支持降低了学习成本。操作简便通过Web界面可以方便地进行任务的创建、编辑、删除和查询等操作。负载均衡XXL-JOB通过执行器实现协同分配式运行任务充分发挥集群优势实现了负载均衡。xxl-job如何获取参数通过任务参数字段在XXL-JOB的任务管理界面每个任务都有一个“任务参数”字段。你可以在这个字段中填写需要传递给执行器的参数。这些参数通常以JSON、键值对或其他格式编写具体取决于你的执行器如何解析这些参数。JobHandler任务方法名填写XxlJob注解中的名称XxlJobHelper主要API说明XxlJobHelper.getJobParam(): 获取任务参数XxlJobHelper.getShardIndex(): 获取当前分片序号XxlJobHelper.getShardTotal(): 获取总分片数XxlJobHelper.handleSuccess(): 标记任务执行成功XxlJobHelper.handleFail(): 标记任务执行失败XxlJobHelper.log(): 记录执行日志String param XxlJobHelper.getJobParam(); long jobId XxlJobHelper.getJobId(); log.info(当前执行的任务ID: {}, jobId); XxlJobHelper.handleSuccess(任务执行成功); XxlJobHelper.log(任务执行异常: {}, e.getMessage()); XxlJobHelper.handleFail(任务执行异常: e.getMessage());单个参数XxlJob(TestOneHandler) public ReturnTString jobDemo(String s) throws Exception { String param XxlJobHelper.getJobParam(); System.out.println(TestOneHandler执行参数: param); return SUCCESS; }多个参数在XXL-JOB调度中心的任务配置中任务参数字段可以填写如下JSON格式内容{startDate:2026-07-01,endDate:2026-07-31}解析方法Value(${config.record.intervalMinute:10}) private int batchMinutes; XxlJob(value old2NewTransferJob) public void execute() { String jsonParam XxlJobHelper.getJobParam(); try { if (!StringUtils.hasLength(jsonParam)) { String msg 调度参数为空请传入 JSON: {\startDate\:\2024-01-01\,\endDate\:\2024-01-31\}; log.error(msg); XxlJobHelper.handleFail(msg); return; } JSONObject json JSON.parseObject(jsonParam); String startDate json.getString(startDate); String endDate json.getString(endDate); if (!StringUtils.hasLength(startDate) || !StringUtils.hasLength(endDate)) { String msg 调度参数缺少 startDate 或 endDate; log.error(msg); XxlJobHelper.handleFail(msg); return; } String sourceTable json.getString(sourceTable); if (!StringUtils.hasLength(sourceTable)) { sourceTable call_log_old; } log.info(开始迁移数据源表:{}, 日期范围:{} ~ {}, sourceTable, startDate, endDate); long tt System.currentTimeMillis(); long totalCount 0; int batchCount 0; String currentDate startDate; while (currentDate.compareTo(endDate) 0) { // 每天按 batchMinutes 分钟分批处理144060*24分钟 for (int minute 0; minute 1440; minute batchMinutes) { String timeStart DateUtils.addMinute(currentDate, minute); String timeEnd DateUtils.addMinute(currentDate, minute batchMinutes); try { int count callLogMapper.transferByTimeRange(sourceTable, timeStart, timeEnd); if (count 0) { totalCount count; batchCount; log.info(迁移批次 {} ~ {} : {} 条, timeStart, timeEnd, count); } } catch (Exception e) { log.error(迁移失败 {}/{}, 时间范围:{} ~ {}, sourceTable, currentDate, timeStart, timeEnd, e); } } currentDate DateUtils.addDay(currentDate, 1); } long elapsed System.currentTimeMillis() - tt; String msg String.format(迁移完成源表:%s, 日期:%s~%s, 总批次数:%d, 总记录数:%d, 耗时:%dms, sourceTable, startDate, endDate, batchCount, totalCount, elapsed); log.info(msg); XxlJobHelper.handleSuccess(msg); } catch (Exception e) { String msg String.format(迁移作业失败,param:%s,throw:%s, jsonParam, e.getMessage()); log.error(迁移作业失败, e); XxlJobHelper.handleFail(msg); } }任务策略路由策略当您在 XXL-JOB 调度中心创建或编辑任务时可以设置以下路由策略FIRST第一个固定选择注册到执行器的第一个节点执行LAST最后一个固定选择注册到执行器的最后一个节点执行ROUND轮询按照顺序轮询选择执行节点RANDOM随机随机选择执行节点CONSISTENT_HASH一致性HASH根据任务参数进行一致性HASH选择LEAST_FREQUENTLY_USED最不经常使用选择历史执行次数最少的节点LEAST_RECENTLY_USED最近最久未使用选择最近最久未执行的节点FAILOVER故障转移失败转移如果某个节点失败则转移到下一个节点BUSYOVER忙碌转移如果某个节点忙碌则转移到空闲节点SHARDING_BROADCAST分片广播向所有注册节点广播执行任务路由策略使用场景1. FIRST第一个使用场景主备模式指定主节点处理关键任务固定执行节点某些任务需要在特定环境下运行测试环境指定测试节点执行任务典型应用核心数据同步任务系统状态检查任务主节点数据汇总任务2. LAST最后一个使用场景备用节点执行作为备用方案执行任务新节点优先新加入的节点优先执行任务典型应用灰度发布环境下的任务执行新版本执行器测试任务3. ROUND轮询使用场景负载均衡多个执行器平均分配任务无状态任务分发避免单点过载典型应用定时数据清理任务日志分析任务批量数据处理任务4. RANDOM随机使用场景简单负载均衡容错性要求高但无严格顺序要求的任务分散执行压力典型应用数据采样任务健康检查任务缓存预热任务5. CONSISTENT_HASH一致性HASH使用场景根据任务参数固定分配执行节点分布式缓存场景需要最小化节点变更影响的场景典型应用用户数据处理任务按用户ID分片订单处理任务按订单ID分片内容分发任务6. LEAST_FREQUENTLY_USED最不经常使用使用场景平衡各节点执行次数避免某些节点过载长期运行的任务调度优化典型应用长周期统计任务资源监控任务性能分析任务7. LEAST_RECENTLY_USED最近最久未使用使用场景平衡各节点执行频率避免热点节点公平调度需求典型应用定期维护任务系统优化任务资源回收任务8. FAILOVER故障转移使用场景高可用要求场景关键业务任务执行不能容忍任务失败的场景典型应用核心数据备份任务业务告警任务交易确认任务9. BUSYOVER忙碌转移使用场景动态负载均衡实时性要求较高的任务避免任务在忙碌节点堆积典型应用实时数据处理任务紧急告警任务在线数据分析任务10. SHARDING_BROADCAST分片广播Component Slf4j public class ShardingExampleTask { XxlJob(shardingExampleJob) public void shardingExample() { // 获取分片参数 int shardIndex XxlJobHelper.getShardIndex(); int shardTotal XxlJobHelper.getShardTotal(); log.info(开始执行分片任务当前分片序号: {}总分片数: {}, shardIndex, shardTotal); // 根据分片参数处理不同数据 processShardingData(shardIndex, shardTotal); log.info(分片任务执行完成); } private void processShardingData(int shardIndex, int shardTotal) { // 示例处理用户数据按用户ID分片 ListUser allUsers userService.getAllUsers(); for (int i 0; i allUsers.size(); i) { // 分片逻辑index % total shardIndex if (i % shardTotal shardIndex) { User user allUsers.get(i); processUser(user); } } } private void processUser(User user) { // 处理单个用户逻辑 log.info(处理用户: {}, user.getId()); } }使用场景大数据量分片处理并行处理需求需要所有节点同时执行任务典型应用大规模数据清洗任务全量数据统计任务分布式计算任务系统批量更新任务阻塞处理策略XXL-JOB提供了多种阻塞处理策略用于控制当任务执行时间超过调度周期时的行为确保任务调度的稳定性和可靠性。阻塞处理策略类型在XXL-JOB调度中心的任务配置中阻塞处理策略字段有以下几种选择单机串行默认策略同一任务在同一个执行器上只能有一个实例在运行丢弃后续调度如果前一个任务未完成后续调度将被丢弃覆盖之前调度新调度会覆盖之前的任务执行允许并发允许多个任务实例同时执行不同策略的适用场景单机串行适用于需要保证任务顺序执行的场景如数据同步、报表生成等丢弃后续调度适用于对实时性要求不高的任务避免资源浪费覆盖之前调度适用于需要最新数据的任务如缓存更新、状态刷新等允许并发适用于可以并行处理的任务如批量数据处理、文件下载等调度过期策略XXL-JOB的调度过期策略是指当任务执行时间超过调度周期时系统如何处理后续调度请求的策略。这直接影响到任务的执行频率和可靠性。调度过期策略类型在XXL-JOB调度中心的任务配置中调度过期策略字段有以下几种选择立即执行无论前一个任务是否完成都立即执行新的调度等待执行等待前一个任务完成后才开始新的调度丢弃执行如果前一个任务未完成直接丢弃新的调度请求覆盖执行新调度会覆盖之前的任务执行不同策略的适用场景立即执行适用于对实时性要求极高的任务如监控告警、实时数据同步等等待执行适用于需要保证任务完整性的场景如报表生成、数据备份等丢弃执行适用于对实时性要求不高的任务避免资源浪费覆盖执行适用于需要最新数据的任务如缓存更新、状态刷新等

相关新闻

React + TypeScript + Redux Toolkit:企业级审批流程设计器架构解析与最佳实践

React + TypeScript + Redux Toolkit:企业级审批流程设计器架构解析与最佳实践

React TypeScript Redux Toolkit:企业级审批流程设计器架构解析与最佳实践 【免费下载链接】dingflow React 仿钉钉审批流、工作流 项目地址: https://gitcode.com/gh_mirrors/di/dingflow 在数字化转型浪潮中,企业审批流程的自动化与可视化设计…

2026/10/19 17:57:48 阅读更多 →
ExcelJS终极指南:5分钟学会JavaScript电子表格处理

ExcelJS终极指南:5分钟学会JavaScript电子表格处理

ExcelJS终极指南:5分钟学会JavaScript电子表格处理 【免费下载链接】exceljs Excel Workbook Manager 项目地址: https://gitcode.com/gh_mirrors/ex/exceljs 还在为JavaScript中处理Excel文件而烦恼吗?ExcelJS是你的完美解决方案!这个…

2026/10/18 21:10:31 阅读更多 →
Cement-[特殊字符]: An Ontology-based Data Access System for Building Analytics with Multiple Data

Cement-[特殊字符]: An Ontology-based Data Access System for Building Analytics with Multiple Data

一、研究背景与问题定义 1.1 背景 数据驱动的建筑分析(如负荷预测、故障检测、系统控制)在建筑能源管理中日益重要。 为了提高建筑分析应用在不同建筑间的可移植性,业界已开发统一的数据模型(如 Brick),通…

2026/10/20 2:36:55 阅读更多 →

最新新闻

Linux常用命令实战指南:从文件操作到排查技巧的完整梳理

Linux常用命令实战指南:从文件操作到排查技巧的完整梳理

刚接触 Linux 的时候,我也找过一份所谓“Linux 常见命令集合”,复制到笔记里当作字典来背。结果可想而知:背了三天,连文件权限数字对应的含义都记不牢。后来在实际项目里摸爬滚打,才慢慢明白,命令不是背出来…

2026/10/20 13:19:13 阅读更多 →
从零构建可维护项目:以rea为例的架构设计与实操指南

从零构建可维护项目:以rea为例的架构设计与实操指南

1. 从“rea”这个标题说起:一个极简命名背后的完整项目思维第一次看到“rea”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率又是一个被随手命名的项目。做技术的人都有这个毛病,项目文件夹建好的那一刻,名字往往是最后才…

2026/10/20 13:19:13 阅读更多 →
Win10下绿联USB转RS232串口驱动安装与故障排查全攻略

Win10下绿联USB转RS232串口驱动安装与故障排查全攻略

简介:绿联USB转RS232串口驱动安装包专门解决Windows 10及Windows 7、macOS等系统下USB转九针串口线无法识别或无法通信的问题,适用于连接收银机、数控机床、门禁系统、温控设备、条码打印机等RS232接口设备。压缩包共9个文件,大小约12.56MB&a…

2026/10/20 13:19:13 阅读更多 →
源码交付与全栈硬件能力:破解物联网项目设备接入最后一米困局

源码交付与全栈硬件能力:破解物联网项目设备接入最后一米困局

源码交付!破解 IoT 项目困局,以全栈硬件能力赋能物联网平台落地,打通设备智能“最后一米”这两年接触了不少做物联网项目的朋友,大家聊到最多的不是“传感器采不到数”,也不是“云平台功能不够用”,而是同一…

2026/10/20 13:19:13 阅读更多 →
Claude账号频繁受限?揭秘风控逻辑与长期稳定使用指南

Claude账号频繁受限?揭秘风控逻辑与长期稳定使用指南

1. 账号频繁受限背后的真实逻辑1.1 为什么你的账号总在“危险边缘”试探很多人用Claude写代码、改文案、做翻译,用着用着突然就登不上了,弹出一个提示说账号存在异常活动。第一反应是“我什么都没干啊”,但平台的风控系统不这么认为。它看到的…

2026/10/20 13:19:13 阅读更多 →
AI Agent实战指南:从底层逻辑到工程落地的避坑手册

AI Agent实战指南:从底层逻辑到工程落地的避坑手册

这两年“AI Agent”这个词,几乎是被硬塞到每一个做技术的人嘴边的。打开任何技术社区,铺天盖地都是“智能体”“多智能体协作”“Agentic Workflow”,好像不搞点Agent,你就不配聊AI一样。但我发现一个很有意思的现象:大…

2026/10/20 13:18:12 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →