springcloud xxl-job
针对你的需求这里整理了一份从 Docker 部署调度中心Admin、SpringBoot 执行器开发、控制台配置到分片广播实战的全流程指南。一、Docker 部署调度中心 (xxl-job-admin)这是任务调度的“大脑”需要依赖 MySQL 数据库。1. 数据库初始化首先在 MySQL 中创建数据库xxl_job并执行https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql初始化表结构。2. Docker 启动 Admin使用官方镜像xuxueli/xxl-job-admin:2.4.0启动容器。注意PARAMS中的数据库连接 IP 需使用 Docker 网络内的 MySQL 容器 IP 或服务名非 127.0.0.1。# 拉取镜像dockerpull xuxueli/xxl-job-admin:2.4.0# 运行容器请替换为你实际的 MySQL 连接信息# 停止并移除旧容器dockerstop xxl-job-admin1dockerrmxxl-job-admin1dockerrun-d\--namexxl-job-admin\-p9080:8080\-v/tmp/xxl-job-logs:/data/applogs\-ePARAMS--spring.datasource.urljdbc:mysql://10.10.1.45:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/ShanghaiuseSSLfalse --spring.datasource.usernameroot --spring.datasource.passwordroot\xuxueli/xxl-job-admin:2.4.0启动后访问http://服务器IP:8080/xxl-job-admin默认账号admin/123456。二、SpringBoot 执行器开发执行器是承载具体任务逻辑的业务服务。1. 项目依赖 (pom.xml)dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.4.0/version/dependency2. 配置文件 (application.yml)xxl:job:admin:addresses:http://你的Admin服务器IP:8080/xxl-job-admin# 调度中心地址accessToken:你的Token# 若调度中心配置了Token此处需一致executor:appname:xxl-job-executor-demo# 必须与Admin控制台执行器AppName一致port:9999# 执行器端口需未被占用logpath:./logs/xxl-job/jobhandlerlogretentiondays:303. 配置类与任务开发ConfigurationpublicclassXxlJobConfig{Value(${xxl.job.admin.addresses})privateStringadminAddresses;// ... 其他配置项accessToken, appname等BeanpublicXxlJobSpringExecutorxxlJobExecutor(){XxlJobSpringExecutorexecutornewXxlJobSpringExecutor();executor.setAdminAddresses(adminAddresses);executor.setAppname(appname);executor.setPort(port);returnexecutor;}}ComponentpublicclassDemoJobHandler{// 1. 简单任务示例XxlJob(demoJobHandler)publicvoiddemoJobHandler()throwsException{XxlJobHelper.log(简单任务执行成功);// 你的业务逻辑...}// 2. 分片任务示例详见第四节XxlJob(shardingJobHandler)publicvoidshardingJobHandler()throwsException{intshardIndexXxlJobHelper.getShardIndex();// 当前分片号(从0开始)intshardTotalXxlJobHelper.getShardTotal();// 总分片数// 模拟处理只有当前分片处理对应数据if(/* 数据ID % shardTotal shardIndex */){// 处理该分片的数据}}}三、调度中心控制台配置1. 配置执行器路径执行器管理-新增AppName必须与项目配置文件中的xxl.job.executor.appname完全一致如xxl-job-executor-demo。注册方式推荐选择自动注册执行器启动后会自动上报地址。2. 配置任务路径任务管理-新增执行器选择上一步创建的执行器。JobHandler填写代码中XxlJob注解的值如demoJobHandler。路由策略单机/负载均衡选择FIRST首台或ROUND轮询。分片处理必须选择分片广播SHARDING_BROADCAST。Cron设置调度表达式。运行模式选择BEAN。四、分片广播开发详解分片广播是解决海量数据并行处理的核心方案。其原理是调度中心一次调度所有在线的执行器实例都会同时被触发每个实例通过shardIndex和shardTotal区分各自处理的数据区间。1. 核心代码逻辑XxlJob(hugeDataJobHandler)publicvoidhugeDataJobHandler()throwsException{intindexXxlJobHelper.getShardIndex();inttotalXxlJobHelper.getShardTotal();// 1. 查询总数据量所有分片查询逻辑一致intallDataCountorderMapper.selectCount();// 2. 计算当前分片负责的数据范围取模分片法ListOrdercurrentShardDataorderMapper.selectByShard(index,total);// 3. 处理当前分片的数据for(Orderorder:currentShardData){// 业务处理...}XxlJobHelper.log(分片[{}/{}]处理完成共处理{}条,index,total,currentShardData.size());}2. 数据分片策略SQL示例假设有 1000 条数据有 2 个执行器分片总数 total2执行器A(index0)处理 ID % 2 0 的数据偶数ID。执行器B(index1)处理 ID % 2 1 的数据奇数ID。对应的 MyBatis SQL 映射selectidselectByShardresultTypeOrderSELECT * FROM order_table WHERE MOD(id, #{total}) #{index} AND status PENDING/select3. 关键注意事项幂等性分片任务可能因重试等原因重复执行业务逻辑需保证幂等。数据倾斜若使用取模分片确保数据ID分布均匀避免某个分片数据量过大。动态扩容执行器实例数变化total变化时需考虑数据迁移或使用一致性哈希等策略。五、常见排错清单执行器显示离线检查appname是否与控制台完全一致检查执行器与 Admin 的网络连通性。任务未触发检查 Cron 表达式是否正确确认任务状态为“启动”。分片不生效确认路由策略选择了分片广播代码中是否正确获取了shardIndex和shardTotal。日志报错 Token 无效检查执行器配置的accessToken是否与 Admin 控制台设置的一致。