XXL-Job定时任务的快速入门(Java必学篇)
目前,我们的定时任务都是基于SpringTask来实现的。但是SpringTask存在一些问题:
-
当微服务多实例部署时,定时任务会被执行多次。而事实上我们只需要这个任务被执行一次即可。
-
我们除了要定时创建表,还要定时持久化Redis数据到数据库,我们希望这多个定时任务能够按照顺序依次执行,SpringTask无法控制任务顺序
-
XXL-Job凭借其轻量、高可用、易扩展、可视化的优势,成为了互联网企业的首选方案,无论是定时数据同步、日志清理,还是订单超时处理(任务执行者的调度、任务执行顺序的编排、任务监控)等功能,它都能轻松应对。
XXL-Job官方文档地址(https://www.xuxueli.com/xxl-job/),建议搭配官方文档学习,获取更详细的功能说明。
XXL-Job的概念及用处:
概述:
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
主要特性:
-
Web CRUD操作:支持通过Web页面对任务进行增删改查,无需编码,一分钟上手;
-
Cron触发策略:提供Cron表达式设定任务执行时间,满足绝大多数定时调度场景;
-
执行器HA:任务执行器支持集群部署,单节点故障时任务可自动切换至其他节点;
-
任务失败重试:支持自定义失败重试次数,任务失败后自动重试,保障任务最终执行成功;
-
任务失败告警:默认提供邮件告警,并支持扩展钉钉、短信等告警方式;
-
Rolling实时日志:支持在线以滚动方式实时查看执行器输出的完整日志,方便排查问题;
-
阻塞处理策略:任务过于密集来不及处理时,支持单机串行、丢弃后续调度、覆盖之前调度三种策略;
-
故障转移:执行器集群中某一台机器故障时,自动Failover切换到正常机器发送调度请求;
-
GLUE模式:支持在线开发任务逻辑代码(Web IDE),动态发布实时生效,省略部署上线过程;
-
动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容提升大数据量处理能力;
-
等等还有很多。
XXL-JOB的运行原理和架构如图:
XXL-JOB分为两部分:
-
执行器:我们的服务引入一个XXL-JOB的依赖,就可以通过配置创建一个执行器。负责与XXL-JOB调度中心交互,执行本地任务。
-
调度中心:一个独立服务,负责管理执行器、管理任务、任务执行的调度、任务结果和日志收集。
下载:
XXL-Job的源码地址:
https://github.com/xuxueli/xxl-job
中央仓库依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
快速入门:
部署调度中心:
运行初始化SQL,创建数据库表
“调度数据库初始化SQL脚本” 位置为:
/xxl-job/doc/db/tables_xxl_job.sql
执行源码初始化表结构(共8张表,包含任务表、执行日志表、注册信息表等)
xxl_job_lock:任务调度锁表;
xxl_job_group:执行器信息表,维护任务执行器信息;
xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
xxl_job_user:系统用户表;
利用Docker命令,创建并运行容器
docker run \
-e PARAMS="--spring.datasource.url=jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DB}?Unicode=true&characterEncoding=UTF-8 \
--spring.datasource.username=${MYSQL_USER} \
--spring.datasource.password=${MYSQL_PASSWORD}" \
--restart=always \
-p ${HOST_PORT}:8080 \
-v xxl-job-admin-applogs:/data/applogs \
--name xxl-job-admin \
-d \
xuxueli/xxl-job-admin:${VERSION}
微服务集成执行器
微服务模块引入依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
执行器配置,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
执行器配置或者在Yaml配置文件里进行配置:
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.admin.accessToken=default_token
### 调度中心通讯超时时间[选填],单位秒;默认3s;
xxl.job.admin.timeout=3
### 执行器启用开关 [选填]:默认开启,关闭时不进行执行器初始化;
xxl.job.executor.enabled=true
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
### 任务扫描排除路径 [选填] :任务扫描时忽略指定包路径下的Bean;支持配置包路径前缀,多个逗号分隔;
xxl.job.executor.excludedpackage=org.springframework,spring
配置执行器:
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
定时任务构建:
定时任务逻辑(Bean模式):
通过@XxlJob注解标记任务方法,该方法就是任务的执行逻辑:

注册执行器:
启动SpringBoot项目(执行器),启动成功后,执行器会自动向调度中心注册;
进入调度中心 → 执行器管理——>新增(注意:微服务模块名),稍等一会,可看到执行器机器地址,状态为“在线”,说明执行器注册成功;
若执行器状态为“离线”,可检查调度中心地址是否配置正确、端口是否冲突、网络是否通畅,或查看执行器日志,搜索“registry success”确认注册是否成功。

构建任务Job:
调度中心 → 任务管理 → 新增任务,填写核心配置(其他配置默认即可):
执行器:选择我们注册的执行器(springboot-xxl-job-executor);
任务描述:填写任务的说明(如“我的第一个XXL-Job任务”);
调度类型:选择“CRON”(最常用,支持复杂的定时规则);
CRON表达式:填写定时规则(如“0/5 * * * * ?” 表示每5秒执行一次,新手可使用CRON在线生成器);
任务类型:Bean模式选择“BEAN”,GLUE模式选择“GLUE(Java)”;
JobHandler:Bean模式填写@XxlJob注解中的标识(如“myFirstJob”),GLUE模式无需填写;
失败重试次数:填写任务失败后重试的次数(如3次)

启动任务并查看结果:
任务配置完成后,点击“启动”按钮,任务开始按照CRON表达式定时执行;
查看任务执行状态:调度中心 → 任务管理,可看到任务的执行状态(运行中/停止)、最近执行时间、执行结果;
查看执行日志:点击任务操作栏的“日志”,可查看每次任务的执行日志,包括任务启动时间、执行耗时、业务日志、执行结果,便于排查问题;
手动触发任务:若需要立即执行任务,可点击“执行一次”,手动触发任务执行,方便测试。
都看到这了,给杰克李点个赞支持一下呗
你的‘赞’,是给与杰克李最大的动力鸭
有问题,可以评论区大家一起讨论
后续会在此更新,相关问题及解决方案
更多推荐



所有评论(0)