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/8/5 19:26:39 阅读更多 →
ExcelJS终极指南:5分钟学会JavaScript电子表格处理

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

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

2026/8/5 19:26:39 阅读更多 →
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/8/5 19:26:38 阅读更多 →

最新新闻

终极指南:快速掌握FF14插件开发利器Dalamud框架

终极指南:快速掌握FF14插件开发利器Dalamud框架

终极指南:快速掌握FF14插件开发利器Dalamud框架 【免费下载链接】Dalamud FFXIV plugin framework and API 项目地址: https://gitcode.com/GitHub_Trending/da/Dalamud Dalamud 是一款专为《最终幻想14》(FF14)设计的强大插件开发框架…

2026/8/5 20:23:01 阅读更多 →
Wayback Machine时光回溯扩展完整指南:让互联网记忆永不消逝

Wayback Machine时光回溯扩展完整指南:让互联网记忆永不消逝

Wayback Machine时光回溯扩展完整指南:让互联网记忆永不消逝 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension …

2026/8/5 20:23:01 阅读更多 →
大型工业厂房分区管控|PLC智能照明节能改造方案

大型工业厂房分区管控|PLC智能照明节能改造方案

一.系统概述现代化大型工业厂房空间跨度大、功能分区复杂,包含生产加工区、物料堆放区、通道通行区、设备检修区、办公附属区等多个区域,不同区域的照明使用时长、亮度标准、启停需求完全不同。传统厂房照明普遍采用传统空开、手动墙开关控制模式&#x…

2026/8/5 20:23:01 阅读更多 →
FGO-py终极指南:全自动FGO助手完整教程,解放双手轻松刷本

FGO-py终极指南:全自动FGO助手完整教程,解放双手轻松刷本

FGO-py终极指南:全自动FGO助手完整教程,解放双手轻松刷本 【免费下载链接】FGO-py 自动爬塔! 自动每周任务! 全自动免配置跨平台的Fate/Grand Order助手.启动脚本,上床睡觉,养肝护发,满加成圣诞了解一下? 项目地址: https://gitcode.com/GitHub_Trend…

2026/8/5 20:23:01 阅读更多 →
终极指南:如何在4MB ESP32开发板上运行AI语音助手

终极指南:如何在4MB ESP32开发板上运行AI语音助手

终极指南:如何在4MB ESP32开发板上运行AI语音助手 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 你是不是曾想过,仅用4MB Flash的ESP32开发…

2026/8/5 20:23:01 阅读更多 →
告别繁琐系统管理!WinUtil:Windows优化与软件部署的一站式解决方案

告别繁琐系统管理!WinUtil:Windows优化与软件部署的一站式解决方案

告别繁琐系统管理!WinUtil:Windows优化与软件部署的一站式解决方案 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 你…

2026/8/5 20:22:01 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →