尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

xxl-job 分布式调度开源系统

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调度中心的任务配置中调度过期策略字段有以下几种选择立即执行无论前一个任务是否完成都立即执行新的调度等待执行等待前一个任务完成后才开始新的调度丢弃执行如果前一个任务未完成直接丢弃新的调度请求覆盖执行新调度会覆盖之前的任务执行不同策略的适用场景立即执行适用于对实时性要求极高的任务如监控告警、实时数据同步等等待执行适用于需要保证任务完整性的场景如报表生成、数据备份等丢弃执行适用于对实时性要求不高的任务避免资源浪费覆盖执行适用于需要最新数据的任务如缓存更新、状态刷新等
返回列表