☰
Lottery 抽奖系统实战:Docker 部署 XXL-JOB 分布式任务调度中心
2026/9/25 20:05:44 网站建设 项目流程
  • 文档
  • 教程
  • 后端

【免费下载链接】CodeGuide

:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!

项目地址:https://gitcode.com/gh_mirrors/code/CodeGuide
点击查看免费下载

导读

本篇技术指南完整讲解在 Lottery 抽奖系统(Docker 环境)中部署 XXL-JOB 分布式任务调度中心的全部步骤:从准备 MySQL 数据库、导入 xxl-job 初始化 SQL 脚本,到拉取官方镜像、以单行docker run命令完成调度中心启动,并逐一拆解PARAMS环境变量中数据源、端口、访问令牌等关键参数的配置含义。读完本文,你不仅能独立部署一套可用的 XXL-JOB 调度中心,还能理解它与 Lottery 项目中活动状态扫描、MQ 消息补偿等定时任务场景的配合方式。

一、为什么 Lottery 项目需要 XXL-JOB

Lottery 抽奖系统在业务推进过程中会遇到典型的定时任务场景,例如:

  • 活动状态扫描:把审核通过的活动扫描为“活动中”,把已过期活动的状态扫描为“关闭”,参见 第17节:引入xxl-job处理活动状态扫描;
  • MQ 消息补偿:扫描抽奖发货单消息状态,对未发送或发送失败的 MQ 进行补偿发送,保障全流程可靠性,参见 第18节:扫描库表补偿发货单MQ消息。

这类需求如果散落在各个应用里各自写Timer、@Scheduled,会面临任务不可视、无重试、无告警、无法集群 HA 等问题。XXL-JOB 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展,其调度中心与执行器分离的架构能够为 Lottery 这类包含多服务、需要集群部署的系统提供统一的任务注册、调度、监控入口。其核心能力包括:

  • 简单:通过 Web 页面对任务进行 CRUD 操作,一分钟上手;
  • 动态:支持动态修改任务状态、启动/停止任务、终止运行中任务,即时生效;
  • 调度中心 HA:中心式设计,支持集群部署;
  • 执行器 HA:任务分布式执行,执行器支持集群部署;
  • 注册中心:执行器周期性自动注册,调度中心自动发现并触发执行;
  • 触发策略:Cron 触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;
  • 阻塞处理策略:单机串行(默认)、丢弃后续调度、覆盖之前调度;
  • 任务超时控制 / 失败重试 / 失败告警:超时主动中断、按预设次数重试、默认邮件告警并预留扩展接口;
  • 路由策略:第一个、最后一个、轮询、随机、一致性 HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
  • 分片广播 / 动态分片:以执行器为维度分片,可随集群扩容动态增加分片数量,提升大数据量任务的处理能力。

正因如此,Lottery 项目在Part-2阶段就引入 XXL-JOB 解决分布式定时任务问题,并在云服务器部署阶段(Part-5)把它作为独立中间件环境安装到 Docker 中。

二、部署前置:先准备好 MySQL 环境

XXL-JOB 调度中心的元数据(执行器注册信息、任务配置、调度日志等)全部持久化在 MySQL 中,因此部署 xxl-job-admin 之前,必须有一个可用的 MySQL 实例。

在 Lottery 的部署链路里,MySQL 环境的安装已经在上一章节完成,详见 第04节:部署环境 Mysql,其核心动作是:

  1. 通过 Docker Hub 或docker search mysql查看可用版本;
  2. 拉取镜像:docker pull mysql:latest;
  3. 启动容器并使用本地 SQL 工具连接 MySQL,创建库表并导入建表语句。

前置提醒:如果你的云服务器还没有 Docker 环境,需要先按 第01节:在云服务器部署 Docker 完成安装。文中示例环境为 CentOS 8.x + Docker 20.10.11,若拉取镜像时报错error response from daemon: Get "https://registry-1.docker.io/v2/...",可在 Docker 配置中补充registry-mirrors镜像加速地址后重启 Docker 解决。

部署 XXL-JOB 前的运维日志归纳如下:

  • 在 Docker 容器中部署 xxl-job;
  • 部署前需要 MySQL 环境(上一章节已安装完成);
  • 本章节下载 xxl-job 2.1.2 对应的 SQL 文件并导入,作为调度中心的初始化数据。

三、导入 xxl-job 初始化 SQL

xxl-job 官方在发布包中提供了初始化脚本,Lottery 项目将 xxl-job 2.1.2 对应的 SQL 文件存放在仓库的doc/assets/sql/xxl-job.sql路径下,可直接打开使用。

1. 创建数据库

使用本地 SQL 链接工具(示例中为 Navicat Premium)连接上一章节部署好的 MySQL,创建一个名为xxl_job的数据库,然后将xxl-job.sql文件整体导入。

2. 导入后生成的调度核心表

脚本导入成功后,xxl_job库下会生成一批 xxl-job 调度中心运行所依赖的表,包括:

表名职责说明
xxl_job_group执行器信息表,保存执行器 AppName、名称、注册方式与地址列表
xxl_job_info任务信息表,保存任务配置、调度 Cron、路由策略、阻塞策略、任务参数等
xxl_job_lock任务调度锁表,用于调度中心集群环境下保证调度的一致性
xxl_job_log调度日志表,记录每次调度触发与执行结果
xxl_job_log_report调度日志报表,用于调度中心统计展示
xxl_job_logglue任务 GLUE 模式(在线编辑代码)的代码历史表
xxl_job_registry执行器注册表,执行器心跳上报后在此登记,调度中心据此发现执行器
xxl_job_user调度中心后台登录用户表(默认账号 admin / 123456)

这些表是调度中心正常工作的数据底座:执行器通过xxl_job_registry完成自动注册,任务调度通过xxl_job_info读取任务配置,运行记录写入xxl_job_log供 Web 台监控。

四、拉取 xxl-job-admin 镜像

xxl-job 官方提供了开箱即用的 Docker 镜像xuxueli/xxl-job-admin,Lottery 部署章节选用的是2.3.0版本,拉取命令如下:

docker pull xuxueli/xxl-job-admin:2.3.0

镜像拉取完成后,可以用docker images确认镜像是否就绪。接下来就是最关键的部署环节——通过一条docker run命令完成调度中心的启动与配置注入。

五、部署 xxl-job 调度中心(Docker 启动命令拆解)

xxl-job-admin 基于 Spring Boot 开发,官方镜像约定通过环境变量PARAMS传入 Spring Boot 的启动参数,从而在不改动镜像内部配置文件的前提下完成端口、数据源、访问令牌的定制。Lottery 项目使用的完整部署命令如下:

docker run -e PARAMS=" --server.port=7397 --spring.datasource.url=jdbc:mysql://172.17.0.6:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 --spring.datasource.username=root --spring.datasource.password=123456 --xxl.job.accessToken=xdsl3ewi3al1oehxmo68pqxer" -p 7397:7397 -v /logs/xxl-job:/data/applogs --name xxl-job-admin --restart=always -d xuxueli/xxl-job-admin:2.3.0

关键提醒:命令中的数据库服务器 IP(172.17.0.6)、账号、密码、accessToken 都需要修改成你自己的实际值。

下面对这条命令逐段拆解说明。

1. 基础运行参数

参数含义
-d后台运行容器,并返回容器 ID
--name xxl-job-admin指定容器名称,便于后续docker logs、docker stop等运维操作
--restart=always容器退出时自动重启,保证调度中心在服务器重启或进程异常退出后能自愈
-p 7397:7397端口映射,格式为「宿主机端口:容器端口」,将容器的 7397 端口暴露到宿主机
-v /logs/xxl-job:/data/applogs数据卷挂载,将容器内的任务执行日志目录/data/applogs映射到宿主机/logs/xxl-job,方便日志持久化与排查
-e PARAMS="..."注入 Spring Boot 启动参数,这是 xxl-job-admin 镜像的配置入口

2.PARAMS中的调度中心参数

PARAMS的本质是追加到java -jar之后的 Spring Boot 命令行参数,优先级高于application.properties,因此无需修改镜像内配置即可完成个性化:

参数示例值说明
--server.port7397调度中心 HTTP 服务端口,与-p 7397:7397的容器端保持一致,浏览器通过该端口访问后台
--spring.datasource.urljdbc:mysql://172.17.0.6:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8JDBC 数据源地址,指向已导入 SQL 的xxl_job库
--spring.datasource.usernameroot数据库账号
--spring.datasource.password123456数据库密码,部署时务必替换为强密码
--xxl.job.accessTokenxdsl3ewi3al1oehxmo68pqxer调度中心与执行器之间的访问令牌,执行器接入时必须配置相同的令牌才能完成注册与调度

3. JDBC URL 中三个关键参数的用意

数据源 URL 中携带的useUnicode、characterEncoding、serverTimezone三个参数值得单独说明:

  • useUnicode=true:启用 Unicode 字符集支持,配合characterEncoding一起使用,避免中文乱码;
  • characterEncoding=UTF-8:指定客户端连接使用 UTF-8 编码,任务名称、日志等中文内容才能正确读写;
  • serverTimezone=GMT%2B8:指定服务器时区为东八区(GMT+8的 URL 编码形式,%2B即+)。MySQL 8.x 驱动对时区敏感,不显式指定会因服务器与客户端时区差异导致时间解析异常,进而影响任务调度时间的计算。

六、部署后的验证与运维检查

容器启动后,建议按以下顺序做一轮验证:

  1. 查看容器状态:docker ps | grep xxl-job-admin,确认容器状态为Up,且--restart=always策略已生效;
  2. 查看启动日志:docker logs -f xxl-job-admin,关注 Spring Boot 启动 Banner、数据源初始化及 Tomcat 端口监听日志,出现Started XxlJobAdminApplication字样即代表启动成功;
  3. 访问调度中心后台:浏览器打开http://云服务器IP:7397/xxl-job-admin,使用默认账号admin/ 密码123456登录(首次登录后建议立即修改默认密码,参见xxl_job_user表)。

若部署在其他云服务器,请确认安全组/防火墙已放行7397端口,否则外部无法访问后台界面。

七、接入 Lottery 应用:执行器注册与任务配置

调度中心部署完成只是第一步,要让 Lottery 应用里的定时任务真正跑起来,还需要完成“执行器”的接入与“任务”的配置,这一链路在 第17节:引入xxl-job处理活动状态扫描 中有完整讲述。其整体协作流程是:

  1. 执行器侧配置:在 Lottery 应用(Spring Boot 工程)中引入xxl-job依赖,配置执行器 AppName、调度中心地址、端口以及与调度中心一致的 accessToken;
  2. 执行器自动注册:应用启动后,执行器周期性向调度中心上报心跳,调度中心通过xxl_job_registry表发现并登记执行器地址;
  3. 后台配置任务:登录调度中心 Web 台,在执行器列表中选择对应 AppName,新增任务并配置 Cron 表达式、路由策略、阻塞处理策略等,任务定义写入xxl_job_info;
  4. 调度触发执行:调度中心按 Cron 触发任务,将调度请求下发到执行器,执行器回调执行结果并写入xxl_job_log,Web 台即可实时查看调度日志与执行进度。

在 Lottery 项目中,任务处理类位于应用层worker包下的LotteryXxlJob中,例如 第18节:扫描库表补偿发货单MQ消息 中的“扫描抽奖发货单消息状态、补偿发送 MQ”任务,就是在LotteryXxlJob中添加任务方法后,再配置到 xxl-job 调度后台完成定时触发。活动状态扫描、MQ 补偿这类任务都依赖分库分表路由能力扫描多张表,调度中心的统一触发与监控正好让这批任务的运行状态一目了然。

八、小结

至此,Lottery 抽奖系统的 XXL-JOB 分布式任务调度中心已在 Docker 环境中部署完毕。整个部署链路可归纳为三步:

  1. 准备 MySQL:沿用上一章节部署的 MySQL 实例,创建xxl_job库并导入官方初始化 SQL(生成xxl_job_info、xxl_job_group、xxl_job_registry等核心表);
  2. 拉取镜像:docker pull xuxueli/xxl-job-admin:2.3.0;
  3. 一键部署:通过-e PARAMS注入端口、数据源、账号密码与 accessToken,配合端口映射、日志卷挂载与--restart=always完成高可用启动。

调度中心就绪后,即可在 Web 后台完成执行器管理与任务配置,让 Lottery 中的活动状态扫描、MQ 消息补偿等分布式定时任务纳入统一调度与监控体系。

  • 文档
  • 教程
  • 后端

【免费下载链接】CodeGuide

:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!

项目地址:https://gitcode.com/gh_mirrors/code/CodeGuide
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询