ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 Lottery 抽奖系统中引入 XXL-JOB:分布式任务调度处理活动状态扫描

在 Lottery 抽奖系统中引入 XXL-JOB:分布式任务调度处理活动状态扫描 文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载本文以 Lottery 分布式抽奖系统DDD 四层架构为背景讲解如何在项目中落地 XXL-JOB 分布式任务调度平台从环境搭建、库表导入、调度中心部署到执行器接入、任务配置与第一个实战场景——扫描抽奖活动状态审核通过→运行中、运行中且已过期→关闭的完整实现思路。读完本文你将掌握 XXL-JOB 的核心概念、功能特性、部署配置方式以及如何用它解决营销场景中的定时任务问题。一、为什么抽奖系统需要任务调度在 Lottery 抽奖系统的生命周期里一个活动要经历多次状态流转编辑、提审、撤审、通过、运行、拒绝、关闭、开启。这 8 个状态在 第08节活动领域的配置与状态 中已经通过状态模式State Pattern实现了前后台操作触发的状态变更。但运营后台人工操作只能覆盖显式的状态变更还有两类状态切换依赖时间与系统自动触发无法靠人肉完成审核通过 → 运行中运营在后台审核通过活动后活动并不立即生效需要等待任务调度系统扫描并把状态推进到运行运行中且已过期 → 关闭活动有明确的起止时间过期后需要自动把状态置为关闭回收流量入口。这两类场景天然适合用定时任务扫描解决。而抽奖系统本身是多实例部署的分布式微服务直接用单机Scheduled会出现多实例重复执行、无法统一管理、无法监控告警等问题。于是项目在分支211106_xfg_xxl-job中引入 XXL-JOB作为统一的分布式任务调度平台。整个项目所需环境mysql/kafka/zk/redis/xxl-job中XXL-JOB 从这一节开始正式登场环境总览见 第01节环境、配置、规范。二、XXL-JOB 是什么XXL-JOB 是一个分布式任务调度平台其核心设计目标是开发迅速、学习简单、轻量级、易扩展。它已开放源代码并接入多家公司线上产品线开箱即用。对于抽奖这类需要定时扫描 多实例执行 可视化管控的营销系统XXL-JOB 提供了开箱即用的调度中心Admin和执行器Executor两段式架构调度中心调度端独立部署的 Web 服务负责任务管理、调度触发、日志查看自带管理后台支持集群部署保证 HA执行器执行端嵌入到业务应用中的轻量组件接收调度中心的调度请求执行任务处理器JobHandler并回传执行结果。这种中心调度、分布执行的设计让任务配置、启停、监控集中在调度中心而业务执行逻辑留在应用内互不侵入。三、搭建分布式任务调度环境XXL-JOB1. 下载运行包并启动调度中心按照开发日志的第一步搭建 XXL-JOB 分布式任务调度环境需要在官网下载 XXL-JOB 运行包按 Java SpringBoot 工程修改基本配置端口、数据源、Token 等项目启动即可得到调度中心。注意前提XXL-JOB 调度中心强依赖 MySQL 存储任务元数据与调度日志因此搭建前需要先准备好一个 MySQL 环境。本项目在 Part-5 的部署章节中已经安装完成 MySQL见 第05节部署环境 xxl-job。2. 导入调度中心库表XXL-JOB 官方提供初始化 SQL用于创建调度中心所需的数据表如xxl_job_info任务表、xxl_job_log调度日志表、xxl_job_registry执行器注册表等。项目对应分支存放了 SQL 文件可直接打开导入-- 使用本地 SQL 链接工具创建 xxl-job 库并导入 xxl-job.sql 文件 CREATE DATABASE IF NOT EXISTS xxl_job DEFAULT CHARACTER SET utf8mb4;导入后即可在调度中心启动时自动完成表结构校验后续任务配置、调度日志都会落在这套表中。3. 以 Docker 方式部署调度中心推荐除下载源码运行包外项目在 第05节部署环境 xxl-job 中还提供了 Docker 一键部署方案步骤如下拉取镜像docker pull xuxueli/xxl-job-admin:2.3.0部署运行注意将数据库 IP、账号、密码、accessToken 修改为你的实际值docker run -e PARAMS --server.port7397 --spring.datasource.urljdbc:mysql://172.17.0.6:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8serverTimezoneGMT%2B8 --spring.datasource.usernameroot --spring.datasource.password123456 --xxl.job.accessTokenxdsl3ewi3al1oehxmo68pqxer -p 7397:7397 -v /logs/xxl-job:/data/applogs --name xxl-job-admin --restartalways -d xuxueli/xxl-job-admin:2.3.0这条命令中值得关注的关键参数参数作用说明--server.port7397调度中心 Web 服务端口宿主机通过-p 7397:7397映射暴露--spring.datasource.url指向 XXL-JOB 元数据库需替换为自己的 MySQL 地址serverTimezoneGMT%2B8表示东八区%2B 是的 URL 编码--spring.datasource.username/password数据库账号密码--xxl.job.accessToken调度中心与执行器之间的通信令牌两端必须一致否则执行器注册失败-v /logs/xxl-job:/data/applogs挂载调度日志目录便于排查--restartalways容器异常退出自动重启配合-d后台运行说明项目文档同时提到了 2.1.2 版本的 SQL 文件与 2.3.0 版本的镜像实操时请以你下载的 XXL-JOB 版本对应的官方 SQL 为准避免表结构与程序不匹配。4. 验证调度中心调度中心启动后浏览器访问http://宿主机IP:7397/xxl-job-admin即可进入管理后台。默认管理员账号为admin/admin123。验证点包括登录管理台是否正常执行器管理中能看到已配置的执行器后续业务执行器注册后会自动出现在这里手动触发一个测试任务查看调度日志中是否产生执行记录。这一过程对应开发日志中的第二步配置基础使用环境、导入库表、配置文件、验证官网管理、测试任务启动运行。四、XXL-JOB 核心功能清单在真正接入业务前先完整了解 XXL-JOB 提供的能力原文档逐条罗列这里整理为分类视图这也有助于在面试中回答为什么选择 XXL-JOB易用与动态性简单支持通过 Web 页面对任务进行 CRUD 操作一分钟上手动态支持动态修改任务状态、启动/停止任务以及终止运行中任务即时生效。高可用3. 调度中心 HA中心式调度采用中心式设计调度中心自研调度组件并支持集群部署可保证调度中心 HA 4. 执行器 HA分布式任务分布式执行任务执行器支持集群部署可保证任务执行 HA 5. 注册中心执行器会周期性自动注册任务调度中心将会自动发现注册的任务并触发执行同时也支持手动录入执行器地址 6. 弹性扩容缩容一旦有新执行器机器上线或者下线下次调度时将会重新分配任务。触发与调度策略7. 触发策略提供丰富的任务触发策略包括 Cron 触发、固定间隔触发、固定延时触发、API事件触发、人工触发、父子任务触发 8. 调度过期策略调度中心错过调度时间的补偿处理策略包括忽略、立即补偿触发一次等 9. 阻塞处理策略调度过于密集、执行器来不及处理时的处理策略包括单机串行默认、丢弃后续调度、覆盖之前调度 10. 任务超时控制支持自定义任务超时时间任务运行超时将会主动中断任务 11. 任务失败重试支持自定义失败重试次数其中分片任务支持分片粒度的失败重试 12. 任务失败告警默认提供邮件方式失败告警同时预留扩展接口可方便地扩展短信、钉钉等告警方式。集群路由与分片13. 路由策略执行器集群部署时提供丰富的路由策略包括第一个、最后一个、轮询、随机、一致性 HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等 14. 分片广播任务路由策略选择分片广播时一次调度会广播触发集群中所有执行器执行一次任务可根据分片参数开发分片任务 15. 动态分片分片广播任务以执行器为维度分片支持动态扩容执行器集群从而动态增加分片数量协同进行业务处理在大数据量业务操作时可显著提升任务处理能力和速度 16. 故障转移路由策略选择故障转移时若执行器集群中某一台机器故障将自动 Failover 切换到一台正常的执行器发送调度请求 17. 任务进度监控支持实时监控任务进度。对抽奖系统而言最常用的组合是Cron 触发 单机串行/故障转移 执行器集群注册既保证扫描任务按时执行又避免多实例重复扫描同一批活动。五、接入执行器开发活动状态扫描任务1. 执行器接入步骤在业务工程中引入 XXL-JOB 执行器依赖并在 SpringBoot 配置类中加入XxlJobSpringExecutorBean配置adminAddresses、accessToken、appname、port等与调度中心保持一致。执行器启动后会周期性自动注册到调度中心对应上文的注册中心特性——抽奖服务的每个实例都会注册为执行器节点。2. 任务开发位置与命名按 DDD 分层约束任务调度属于应用编排层的能力不直接写进领域层。项目的做法是在application 应用层的 worker 包LotteryXxlJob中集中维护所有 XXL-JOB 任务这一点在 第18节扫描库表补偿发货单MQ消息 中有明确印证后续的 MQ 补偿任务同样放在LotteryXxlJob中。任务方法上使用XxlJob(任务标识)注解注册 JobHandler例如// cn.itedus.lottery.application.worker.LotteryXxlJob示意结构 Component public class LotteryXxlJob { private final Logger logger LoggerFactory.getLogger(LotteryXxlJob.class); Resource private IActivityRepository activityRepository; // 活动仓储领域层定义 XxlJob(lotteryActivityStateJobHandler) public void lotteryActivityStateJobHandler() throws Exception { logger.info(扫描抽奖活动状态任务开始执行); // 1. 扫描审核通过(状态4)且未过期的活动推进为运行(状态5) // 2. 扫描处于运行(状态5)但已过期的活动置为关闭(状态7) // 3. 通过活动仓储更新库表中的活动状态 logger.info(扫描抽奖活动状态任务执行完成); } }与状态模式的衔接活动状态枚举及状态流转规则在 第08节活动领域的配置与状态 中已定义活动状态1编辑、2提审、3撤审、4通过、5运行(审核通过后 worker 扫描状态)、6拒绝、7关闭、8开启注意状态 5 的注释里就明确写着审核通过后 worker 扫描状态——这正是本节的职责。数据库侧活动表state字段为tinyint(2)其注释同样声明了这 8 种状态见 第03节跑通广播模式RPC过程调用 中的建表语句。从代码结构看扫描任务只需关注两个方向的流转4 通过 → 5 运行活动审核通过且当前时间在活动起止时间内把状态推进为运行中5 运行 → 7 关闭活动已运行但当前时间超过活动结束时间把状态置为关闭。状态变更的落库仍复用领域层的仓储接口与状态流转服务保证谁变更状态、如何校验合法性的逻辑收敛在领域层任务层只负责何时触发扫描。整个调用链可以概括为调度中心按 Cron 触发 → 执行器回调XxlJob方法 → application 层 worker 扫描活动 → 调用 domain 层仓储/状态服务 → 更新 activity 表状态。3. 后续场景复用这一节解决的只是活动状态扫描第一个分布式任务场景。开发日志中明确说明后续章节还会使用分布式任务调度系统解决其他场景问题。最典型的延续就是 第18节扫描库表补偿发货单MQ消息——扫描抽奖发货单消息状态对未发送 MQ 或发送失败的 MQ 进行补偿发送保障中奖落库 → MQ → 发奖全流程的可靠性。可见引入 XXL-JOB 后定时任务能力可以低成本地复用到系统内所有兜底扫描场景。六、在调度中心配置任务任务开发完成后需要把任务配置到 XXL-JOB 任务调度后台中关于任务的配置步骤在 第18节扫描库表补偿发货单MQ消息 中明确说明上一个章节已经讲述过即本节内容。在调度中心任务管理中新增任务核心配置项如下配置项本场景建议值说明执行器抽奖应用注册的执行器 appname决定任务由哪个些执行器承载任务描述活动状态扫描便于后台识别调度类型CRON使用 Cron 表达式控制扫描频率Cron如0 0/5 * * * ?每 5 分钟扫描一次可根据活动时效粒度调整运行模式BEAN通过XxlJob注解的 JobHandler 执行JobHandlerlotteryActivityStateJobHandler与代码中XxlJob(...)标识一致路由策略第一个或故障转移活动状态扫描只需一个实例执行即可避免重复扫描集群场景可选故障转移增强可靠性阻塞处理策略单机串行默认若上一轮扫描未完成下一轮调度排队执行避免并发扫同一批数据失败重试次数按需设置扫描任务幂等失败可安全重试调度过期策略忽略错过调度时间不补偿等待下一轮即可活动状态扫描允许一定延迟配置完成后点击执行一次即可在调度日志中看到执行结果验证任务链路是否打通。七、为什么选择 XXL-JOB含面试视角在 Lottery 面试问题汇总 中收录了一道典型面试题为什么选择 xxl-job 执行定时任务了解其他任务调度组件吗。结合本项目可以这样回答开箱即用、学习成本低自带可视化调度中心Web 页面即可完成任务的 CRUD、启停、日志查看符合项目开发迅速、学习简单的选型诉求架构贴合微服务调度中心与执行器分离执行器天然支持集群注册与弹性扩缩容与抽奖系统多实例部署形态完全匹配且路由策略第一个、故障转移、轮询、分片广播等覆盖了从单实例扫描到大数据量分片处理的各种诉求可靠性保障完整阻塞处理策略、任务超时控制、失败重试、失败告警邮件可扩展短信/钉钉、调度过期补偿等机制齐全配合调度中心 HA 与执行器 HA适合对任务可靠性要求高的营销场景与项目自研组件的兼容性抽奖系统大量使用自研的 db-router-spring-boot-starter 做分库分表路由XXL-JOB 作为独立调度平台不侵入业务代码两者可以无缝配合——比如后续 MQ 补偿任务就是XXL-JOB 定时触发 路由组件按库表循环扫描的经典组合见 第18节扫描库表补偿发货单MQ消息。对比维度上也可以简要提及同类组件的差异如 Quartz 单机化、无统一管控台Elastic-Job 功能强但学习与运维成本更高但核心结论是在业务体量可控、追求快速落地和可视化运维的营销抽奖场景下XXL-JOB 是平衡功能、成本与稳定性的务实选择。八、小结本节分支211106_xfg_xxl-job完成了抽奖系统分布式任务调度的从 0 到 1环境搭建下载运行包 / Docker 部署调度中心导入 XXL-JOB 库表并配置数据源与 accessToken基础验证在调度中心管理台验证执行器注册与任务触发首个业务场景落地在 application 层LotteryXxlJobworker 中开发活动状态扫描任务把审核通过(4) → 运行(5)和运行(5) 且已过期 → 关闭(7)的自动流转跑通与 第08节 的状态模式无缝衔接能力沉淀XXL-JOB 的任务编排、HA、路由、分片、告警等能力为后续 MQ 补偿、库存扫描等更多定时场景提供了统一底座。至此抽奖系统的活动生命周期真正实现了人工审核 系统自动流转的双轨驱动也为后续章节中更多的分布式任务场景打下了基础。延伸阅读第18节扫描库表补偿发货单MQ消息、第05节部署环境 xxl-job、第08节活动领域的配置与状态。赞分享文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载相关推荐Lottery 抽奖系统活动领域实战DDD 分层下活动配置事务落库与状态模式状态流转Lottery 抽奖系统活动领域实战DDD 分层下活动配置事务落库与状态模式状态流转 本篇基于 Lottery 分布式抽奖系统项目 Part 2 第 08 节文档教程后端XXL-JOB任务调度系统的并发处理能力解析XXL JOB任务调度系统的并发处理能力解析 XXL JOB作为一款优秀的分布式任务调度平台其并发处理能力是许多开发者和架构师关注的重点。本文将深入分析XXL任务调度后端XXL-JOB 分布式任务调度框架技术文档XXL JOB 分布式任务调度框架技术文档 1. 安装指南 1.1 环境要求 JDK 1.8 MySQL 5.7 Maven 3.0 1.2 源码获取 b任务调度后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表