1. 为什么你需要一个分布式任务调度系统?
如果你正在开发一个SpringBoot应用,是不是经常遇到这样的场景:每天凌晨需要跑个报表、每隔5分钟要同步一次用户数据、每周一早上要给所有用户发个提醒邮件……这些定时任务,一开始你可能直接用Spring自带的@Scheduled注解就搞定了,简单省事。
但随着业务发展,问题就来了。你的应用从单机部署变成了集群,这时候定时任务会在每个节点上都跑一遍,数据重复处理,甚至可能引发脏数据。任务执行失败了怎么办?你想手动触发一次怎么办?任务执行到一半,服务器重启了,任务状态怎么恢复?更头疼的是,你想看看任务执行的详细日志,却发现它们散落在各个服务器上,找起来像大海捞针。
我经历过一个真实的项目,早期就是用@Scheduled,后来用户量上来,上了三台服务器做负载均衡。结果“每日数据清理”这个任务,在三台机器上同时启动,把同一批数据删了三次,直接导致部分数据丢失。从那次以后,我就下定决心,必须引入一个中心化、可视化、高可靠的任务调度系统。
这就是XXL-Job登场的时候了。它本质上是一个“任务调度中心”,你可以把它想象成一个“项目经理”。所有的定时任务(比如生成报表、发送邮件)都注册到这个中心。由这个“项目经理”统一决定什么时候、在哪个“工人”(也就是你的业务应用,称为“执行器”)身上执行什么任务。任务执行的结果和日志,也会统一汇报给这个中心,方便你随时查看和管理。
和SpringBoot整合后,你的业务应用就变成了听话的“工人”,只负责干活(业务逻辑),而什么时候干、干得怎么样,全部交给XXL-Job这个“项目经理”来统筹。这样一来,即使你的SpringBoot应用部署了10个、100个实例,任务也只会被调度一次,完美解决了集群下的任务重复执行问题。接下来,我就手把手带你从零开始,把这个“项目经理”请进你的SpringBoot项目。
2. 第一步:部署调度中心(XXL-Job Admin)
调度中心是XXL-Job的大脑,是一个独立部署的Web应用。我们需要先把它搭建起来。
2.1 环境准备与源码获取
首先确保你的开发环境满足以下要求,这些都是基础,缺一不可:
- JDK 1.8+:我推荐用JDK 8或11,兼容性最好。
- Maven 3.x:用于项目构建。
- MySQL 5.7+:我用的是MySQL 8.0,完全没问题,调度中心的所有元数据(任务信息、日志等)都存储在这里。
获取源码有两种主流方式,我通常用Gitee,因为在国内下载速度更快:
- GitHub:
https://github.com/xuxueli/xxl-job - Gitee(码云):
https://gitee.com/xuxueli0323/xxl-job
打开终端,执行克隆命令:
git clone https://gitee.com/xuxueli0323/xxl-job.git
cd xxl-job
拉取完成后,用IDE(比如IntelliJ IDEA或Eclipse)打开这个项目。你会看到它的目录结构非常清晰:
doc/: 存放数据库脚本和文档。xxl-job-admin/: 调度中心模块,这就是我们要部署的核心。xxl-job-core/: 核心依赖包,执行器项目需要引入它。xxl-job-executor-samples/: 各种执行器示例,我们重点看里面的springboot版本。
2.2 初始化数据库
调度中心需要一个数据库来存储任务、日志、执行器注册信息等。这一步很简单,但至关重要。
- 在你的MySQL中创建一个数据库,名字可以自定义,比如
xxl_job。 - 找到项目中的数据库脚本文件:
/doc/db/tables_xxl_job.sql。 - 在你的数据库客户端(如Navicat、MySQL Workbench)或命令行中,连接到
xxl_job数据库,然后执行这个SQL脚本。
执行成功后,你会看到创建了若干张表,其中最重要的几张表是:
xxl_job_info: 存储所有任务的基本信息。xxl_job_log: 存储每次任务调度的详细日志。xxl_job_registry: 动态注册上来的执行器地址。xxl_job_group: 执行器集群分组信息。
有了这些表,调度中心就有了记忆能力,任务状态、执行历史都不会丢失。
2.3 配置与启动调度中心
现在我们来配置调度中心,让它能连上我们刚创建的数据库。配置文件位于: /xxl-job-admin/src/main/resources/application.properties
你需要修改的核心配置项主要是数据库连接部分,找到下面这几行:
### 调度中心JDBC链接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=你的数据库密码
把url中的IP、端口、数据库名,以及username和password换成你自己的。这里有个小坑要注意:如果用的是MySQL 8.0,驱动类spring.datasource.driver-class-name可能需要改为com.mysql.cj.jdbc.Driver,并且url里建议加上&allowPublicKeyRetrieval=true。
其他配置项你可以先保持默认,比如报警邮箱(spring.mail开头的配置)可以先不配,等后续需要邮件告警时再设置。还有一个叫xxl.job.accessToken的配置,这是调度中心和执行


5550

被折叠的 条评论
为什么被折叠?



