xxl-Job
1. 简介:
针对分布式任务调度的需求,市场上出现了很多的产品:
1) TBSchedule:淘宝推出的一款非常优秀的高性能分布式调度框架,目前被应用于阿里、京东、支付宝、国美等很多互联网企业的流程调度系统中。但是已经多年未更新,文档缺失严重,缺少维护。
2) XXL-Job:大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
3)Elastic-job:当当网借鉴TBSchedule并基于quartz 二次开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,具有任务高可用以及分片功能。
4)Saturn: 唯品会开源的一个分布式任务调度平台,基于Elastic-job,可以全域统一配置,统一监控,具有任务高可用以及分片功能。
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
源码地址:https://gitee.com/xuxueli0323/xxl-job
文档地址:https://www.xuxueli.com/xxl-job/
2. 特性:
- 简单灵活
提供Web页面对任务进行管理,管理系统支持用户管理、权限控制;
支持容器部署;
支持通过通用HTTP提供跨平台任务调度; - 丰富的任务管理功能
支持页面对任务CRUD操作;
支持在页面编写脚本任务、命令行任务、Java代码任务并执行;
支持任务级联编排,父任务执行结束后触发子任务执行;
支持设置指定任务执行节点路由策略,包括轮询、随机、广播、故障转移、忙碌转移等;
支持Cron方式、任务依赖、调度中心API接口方式触发任务执行 - 高性能
任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰; - 高可用
任务调度中心、任务执行节点均 集群部署,支持动态扩展、故障转移
支持任务配置路由故障转移策略,执行器节点不可用是自动转移到其他节点执行
支持任务超时控制、失败重试配置
支持任务处理阻塞策略:调度当任务执行节点忙碌时来不及执行任务的处理策略,包括:串行、抛弃、覆盖策略 - 易于监控运维
支持设置任务失败邮件告警,预留接口支持短信、钉钉告警;
支持实时查看任务执行运行数据统计图表、任务进度监控数据、任务完整执行日志;
3. 调度中心:
在分布式架构下,通过XXL-Job实现定时任务
调度中心:负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。
任务执行器:负责接收调度请求并执行任务逻辑。
任务:专注于任务的处理。
调度中心会发出调度请求,任务执行器接收到请求之后会去执行任务,任务则专注于任务业务的处理。
4. 快速入门
第一步:数据库
请下载项目源码并解压,获取 “调度数据库初始化SQL脚本” 并执行即可。(资料自取)
- xxl_job_lock:任务调度锁表;
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_user:系统用户表;
第二步:源码解压
解压源码,按照maven格式将源码导入IDEA, 使用maven进行编译即可,源码结构如下:
第三步:配置调度中心
虚拟机中启动xuxueli/xxl-job-admin:2.2.0
镜像
调度中心访问地址:http://192.168.85.143:8080/xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
本机配置启动
-
步骤一:调度配置中心配置
调度中心配置文件地址:
/xxl-job/xxl-job-admin/src/main/resources/application.properties
数据库的连接信息修改为自己的数据库
### xxl-job, datasource spring.datasource.url=jdbc:mysql://192.168.85.143:3306/xxl_job?Unicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-
步骤二:部署项目
启动项目
com.xxl.job.admin.XxlJobAdminApplication
调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)
默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
第四步:搭建SpringBoot项目
新建项目:spring-task-demo
-
步骤一:依赖导入
<!-- 继承Spring boot工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- xxl-job --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version> </dependency> </dependencies>
-
步骤二:配置文件
server: port: 8081 xxl: job: admin: addresses: http://127.0.0.1:8080/xxl-job-admin # xxl源码中xxl-job-admin的配置文件有指定端口(8080) executor: appname: spring-task-demo port: 9999 # xxl访问其他微服务时需要外抛端口进行访问
-
步骤三:添加配置类
package com.itheima.job.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * xxl-job config * * @author xuxueli 2017-04-28 */ @Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.port}") private int port; @Bean public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setPort(port); return xxlJobSpringExecutor; } /** * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP; * * 1、引入依赖: * <dependency> * <groupId>org.springframework.cloud</groupId> * <artifactId>spring-cloud-commons</artifactId> * <version>${version}</version> * </dependency> * * 2、配置文件,或者容器启动变量 * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' * * 3、获取IP * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); */ }
-
步骤四:创建任务
package com.itheima.job.task; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * 定时任务 * * @Name MyTask * @Author 26379 * @Date 2022-10-15 8:58 */ @Slf4j @Component public class MyTask { //@Scheduled(cron = "0/5 * * * * ?") @XxlJob(("showTimeHandler")) public ReturnT<String> showTime(String param) { log.info("执行了showTime方法"); return ReturnT.SUCCESS; } }
-
启动测试
-
配置执行器
这里的AppName要和SpringBoot项目中的配置文件appName要一致
(1)新建两个项目,用同一个Handler
(2)编辑配置
application-p1配置:
server:
port: 8082
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
appname: spring-task-demo
port: 9998
(3)启动
-
在调度中心新建任务(任务管理)
@XxlJob(("showTimeHandler")) 测试项目中的配置类
这个一定要与调度中心新建任务的JobHandler的值保持一致,如下图
执行测试即可