|
@@ -1,4 +1,4 @@
|
|
|
-# 《分布式任务调度平台XXL-JOB》
|
|
|
+## 《分布式任务调度平台XXL-JOB》
|
|
|
|
|
|
[](https://travis-ci.org/xuxueli/xxl-job)
|
|
|
[](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/)
|
|
@@ -48,7 +48,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
|
|
|
于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。
|
|
|
|
|
|
-#### 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
|
|
|
+> 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
|
|
|
据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。
|
|
|
|
|
|
至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止2016-07-19为止,XXL-JOB已接入的公司包括不限于:
|
|
@@ -91,10 +91,18 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
- 36、增长引擎(北京)信息技术有限公司
|
|
|
- ……
|
|
|
|
|
|
+> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
|
|
|
+
|
|
|
欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
|
|
|
|
|
|
+
|
|
|
### 1.4 下载
|
|
|
|
|
|
+#### 文档地址
|
|
|
+
|
|
|
+- [中文文档](http://www.xuxueli.com/xxl-job/)
|
|
|
+- [English Documentation](http://www.xuxueli.com/xxl-job/en/)
|
|
|
+
|
|
|
#### 源码仓库地址
|
|
|
|
|
|
源码仓库地址 | Release Download
|
|
@@ -114,11 +122,6 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
</dependency>
|
|
|
```
|
|
|
|
|
|
-#### 博客地址
|
|
|
-
|
|
|
-- [oschina地址](http://my.oschina.net/xuxueli/blog/690978)
|
|
|
-- [cnblogs地址](http://www.cnblogs.com/xuxueli/p/5021979.html)
|
|
|
-
|
|
|
#### 技术交流
|
|
|
|
|
|
- 腾讯QQ群(6):399758605
|
|
@@ -287,7 +290,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
本示例以新建一个 “GLUE模式(Java)” 运行模式的任务为例。更多有关任务的详细配置,请查看“章节三:任务详解”。
|
|
|
( “GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量)
|
|
|
|
|
|
-#### 前提:请确认“调度中心”和“执行器”项目已经成功部署并启动;
|
|
|
+> 前提:请确认“调度中心”和“执行器”项目已经成功部署并启动;
|
|
|
|
|
|
#### 步骤一:新建任务:
|
|
|
登录调度中心,点击下图所示“新建任务”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。
|
|
@@ -411,7 +414,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
|
|
|
|
|
|
## 四、任务管理
|
|
|
-#### 4.0 配置执行器
|
|
|
+
|
|
|
+### 4.0 配置执行器
|
|
|
点击进入"执行器管理"界面, 如下图:
|
|
|

|
|
|
|
|
@@ -421,7 +425,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
点击按钮 "+新增执行器" 弹框如下图, 可新增执行器配置:
|
|
|

|
|
|
|
|
|
-#### 执行器属性说明
|
|
|
+### 执行器属性说明
|
|
|
|
|
|
AppName: 是每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册。可通过该配置自动发现注册成功的执行器, 供任务调度时使用;
|
|
|
名称: 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;
|
|
@@ -431,30 +435,30 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
手动录入:人工手动录入执行器的地址信息,多地址逗号分隔,供调度中心使用;
|
|
|
机器地址:"注册方式"为"手动录入"时有效,支持人工维护执行器的地址信息;
|
|
|
|
|
|
-#### 4.1 新建任务
|
|
|
+### 4.1 新建任务
|
|
|
进入任务管理界面,点击“新增任务”按钮,在弹出的“新增任务”界面配置任务属性后保存即可。详情页参考章节 "三、任务详解"。
|
|
|
|
|
|
-#### 4.2 编辑任务
|
|
|
+### 4.2 编辑任务
|
|
|
进入任务管理界面,选中指定任务。点击该任务右侧“编辑”按钮,在弹出的“编辑任务”界面更新任务属性后保存即可,可以修改设置的任务属性信息:
|
|
|
|
|
|
-#### 4.3 编辑GLUE代码
|
|
|
+### 4.3 编辑GLUE代码
|
|
|
|
|
|
该操作仅针对GLUE任务。
|
|
|
|
|
|
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发。可参考章节 "3.2 GLUE模式(Java)"。
|
|
|
|
|
|
-#### 4.4 暂停/恢复任务
|
|
|
+### 4.4 暂停/恢复任务
|
|
|
可对任务进行“暂停”和“恢复”操作。
|
|
|
需要注意的是,此处的暂停/恢复仅针对任务的后续调度触发行为,不会影响到已经触发的调度任务,如需终止已经触发的调度任务,可查看“4.8 终止运行中的任务”
|
|
|
|
|
|

|
|
|
|
|
|
-#### 4.5 手动触发一次调度
|
|
|
+### 4.5 手动触发一次调度
|
|
|
点击“执行”按钮,可手动触发一次任务调度,不影响原有调度规则。
|
|
|
|
|
|

|
|
|
|
|
|
-#### 4.6 查看调度日志
|
|
|
+### 4.6 查看调度日志
|
|
|
点击“日志”按钮,可以查看任务历史调度日志。在历史调入日志界面可查看每次任务调度的调度结果、执行结果等,点击“执行日志”按钮可查看执行器完整日志。
|
|
|
|
|
|

|
|
@@ -474,12 +478,12 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
|
|
|
"执行日志"按钮:点击可查看本地任务执行的详细日志信息;详见“4.7 查看执行日志”;
|
|
|
"终止任务"按钮:点击可终止本地调度对应执行器上本任务的执行线程,包括未执行的阻塞任务一并被终止;
|
|
|
|
|
|
-#### 4.7 查看执行日志
|
|
|
+### 4.7 查看执行日志
|
|
|
点击执行日志右侧的 “执行日志” 按钮,可跳转至执行日志界面,可以查看业务代码中打印的完整日志,如下图;
|
|
|
|
|
|

|
|
|
|
|
|
-#### 4.8 终止运行中的任务
|
|
|
+### 4.8 终止运行中的任务
|
|
|
仅针对执行中的任务。
|
|
|
在任务日志界面,点击右侧的“终止任务”按钮,将会向本次任务对应的执行器发送任务终止请求,将会终止掉本次任务,同时会清空掉整个任务执行队列。
|
|
|
|
|
@@ -502,26 +506,27 @@ try{
|
|
|
而且,在JobHandler中开启子线程时,子线程也不可catch处理"InterruptedException",应该主动向上抛出。
|
|
|
|
|
|
|
|
|
-#### 4.9 删除执行日志
|
|
|
+### 4.9 删除执行日志
|
|
|
在任务日志界面,选中执行器和任务之后,点击右侧的"删除"按钮将会出现"日志清理"弹框,弹框中支持选择不同类型的日志清理策略,选中后点击"确定"按钮即可进行日志清理操作;
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|
-#### 4.10 删除任务
|
|
|
+### 4.10 删除任务
|
|
|
点击删除按钮,可以删除对应任务。
|
|
|
|
|
|

|
|
|
|
|
|
+
|
|
|
## 五、总体设计
|
|
|
-#### 5.1 源码目录介绍
|
|
|
+### 5.1 源码目录介绍
|
|
|
- /doc :文档资料
|
|
|
- /db :“调度数据库”建表脚本
|
|
|
- /xxl-job-admin :调度中心,项目源码
|
|
|
- /xxl-job-core :公共Jar依赖
|
|
|
- /xxl-job-executor-samples :执行器,Sample示例项目(大家可以在该项目上进行开发,也可以将现有项目改造生成执行器项目)
|
|
|
|
|
|
-#### 5.2 “调度数据库”配置
|
|
|
+### 5.2 “调度数据库”配置
|
|
|
XXL-JOB调度模块基于Quartz集群实现,其“调度数据库”是在Quartz的11张集群mysql表基础上扩展而成。
|
|
|
|
|
|
XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。
|
|
@@ -537,15 +542,15 @@ XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。
|
|
|
|
|
|
因此,XXL-JOB调度数据库共计用于16张数据库表。
|
|
|
|
|
|
-#### 5.3 架构设计
|
|
|
-##### 5.3.1 设计思想
|
|
|
+### 5.3 架构设计
|
|
|
+#### 5.3.1 设计思想
|
|
|
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
|
|
|
|
|
|
将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。
|
|
|
|
|
|
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
|
|
|
|
|
|
-##### 5.3.2 系统组成
|
|
|
+#### 5.3.2 系统组成
|
|
|
- **调度模块(调度中心)**:
|
|
|
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
|
|
|
支持可视化、简单且动态的维管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
|
|
@@ -553,24 +558,24 @@ XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。
|
|
|
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
|
|
|
接收“调度中心”的执行请求、终止请求和日志请求等。
|
|
|
|
|
|
-##### 5.3.3 架构图
|
|
|
+#### 5.3.3 架构图
|
|
|
|
|
|

|
|
|
|
|
|
-#### 5.4 调度模块剖析
|
|
|
-##### 5.4.1 quartz的不足
|
|
|
+### 5.4 调度模块剖析
|
|
|
+#### 5.4.1 quartz的不足
|
|
|
Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:
|
|
|
- 问题一:调用API的的方式操作任务,不人性化;
|
|
|
- 问题二:需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。
|
|
|
- 问题三:调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务;
|
|
|
XXL-JOB弥补了quartz的上述不足之处。
|
|
|
|
|
|
-##### 5.4.2 RemoteHttpJobBean
|
|
|
+#### 5.4.2 RemoteHttpJobBean
|
|
|
常规Quartz的开发,任务逻辑一般维护在QuartzJobBean中,耦合很严重。XXL-JOB中“调度模块”和“任务模块”完全解耦,调度模块中的所有调度任务使用同一个QuartzJobBean,即RemoteHttpJobBean。不同的调度任务将各自参数维护在各自扩展表数据中,当触发RemoteHttpJobBean执行时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务。
|
|
|
|
|
|
这种调用模型类似RPC调用,RemoteHttpJobBean提供调用代理的功能,而执行器提供远程服务的功能。
|
|
|
|
|
|
-##### 5.4.3 调度中心HA(集群)
|
|
|
+#### 5.4.3 调度中心HA(集群)
|
|
|
基于Quartz的集群方案,数据库选用Mysql;集群分布式并发环境中使用QUARTZ定时任务调度,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
|
|
|
|
|
|
```
|
|
@@ -582,7 +587,7 @@ org.quartz.jobStore.isClustered: true
|
|
|
org.quartz.jobStore.clusterCheckinInterval: 1000
|
|
|
```
|
|
|
|
|
|
-##### 5.4.4 调度线程池
|
|
|
+#### 5.4.4 调度线程池
|
|
|
默认线程池中线程的数量为10个,避免单线程因阻塞而引起任务调度延迟。
|
|
|
|
|
|
```
|
|
@@ -596,12 +601,12 @@ XXL-JOB系统中业务逻辑在远程执行器执行,调度中心每次调度
|
|
|
|
|
|
XXL-JOB调度中心中每个JOB逻辑非常 “轻”,单个JOB一次运行平均耗时基本在 "100ms" 之内(基本是网络开销);因此,可以保证使用有限的线程支撑大量的JOB并发运行;上面配置的10个线程至少可以支撑100个JOB正常运行;
|
|
|
|
|
|
-##### 5.4.5 @DisallowConcurrentExecution
|
|
|
+#### 5.4.5 @DisallowConcurrentExecution
|
|
|
XXL-JOB调度模块的“调度中心”默认不使用该注解,即默认开启并行机制,因为RemoteHttpJobBean为公共QuartzJobBean,这样在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。
|
|
|
|
|
|
XXL-JOB的每个调度任务虽然在调度模块是并行调度执行的,但是任务调度传递到任务模块的“执行器”确实串行执行的,同时支持任务终止。
|
|
|
|
|
|
-##### 5.4.6 misfire
|
|
|
+#### 5.4.6 misfire
|
|
|
错过了触发时间,处理规则。
|
|
|
可能原因:服务重启;调度线程被QuartzJobBean阻塞,线程被耗尽;某个任务启用了@DisallowConcurrentExecution,上次调度持续阻塞,下次调度被错过;
|
|
|
|
|
@@ -622,7 +627,7 @@ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobIn
|
|
|
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
|
|
|
```
|
|
|
|
|
|
-##### 5.4.7 日志回调服务
|
|
|
+#### 5.4.7 日志回调服务
|
|
|
调度模块的“调度中心”作为Web服务部署时,一方面承担调度中心功能,另一方面也为执行器提供API服务。
|
|
|
|
|
|
调度中心提供的"日志回调服务API服务"代码位置如下:
|
|
@@ -632,7 +637,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
|
|
|
“执行器”在接收到任务执行请求后,执行任务,在执行结束之后会将执行结果回调通知“调度中心”:
|
|
|
|
|
|
-##### 5.4.8 任务HA(Failover)
|
|
|
+#### 5.4.8 任务HA(Failover)
|
|
|
执行器如若集群部署,调度中心将会感知到在线的所有执行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。
|
|
|
|
|
|
当任务"路由策略"选择"故障转移(FAILOVER)"时,当调度中心每次发起调度请求时,会按照顺序对执行器发出心跳检测请求,第一个检测为存活状态的执行器将会被选定并发送调度请求。
|
|
@@ -644,7 +649,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
“调度备注”可以看出本地调度运行轨迹,执行器的"注册方式"、"地址列表"和任务的"路由策略"。"故障转移(FAILOVER)"路由策略下,调度中心首先对第一个地址进行心跳检测,心跳失败因此自动跳过,第二个依然心跳检测失败……
|
|
|
直至心跳检测第三个地址“127.0.0.1:9999”成功,选定为“目标执行器”;然后对“目标执行器”发送调度请求,调度流程结束,等待执行器回调执行结果。
|
|
|
|
|
|
-##### 5.4.9 调度日志
|
|
|
+#### 5.4.9 调度日志
|
|
|
调度中心每次进行任务调度,都会记录一条任务日志,任务日志主要包括以下三部分内容:
|
|
|
|
|
|
- 任务信息:包括“执行器地址”、“JobHandler”和“执行参数”等属性,根据这些参数,可以精确的定位任务执行的具体机器和任务代码;
|
|
@@ -665,7 +670,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
- 执行备注:执行器,任务执行的备注信息,如异常日志等;
|
|
|
- 执行日志:任务执行过程中,业务代码中打印的完整执行日志,见“4.7 查看执行日志”;
|
|
|
|
|
|
-##### 5.4.10 任务依赖
|
|
|
+#### 5.4.10 任务依赖
|
|
|
原理:XXL-JOB中每个任务都对应有一个任务Key,同时,每个任务支持设置属性“子任务Key”,因此,通过“任务Key”可以匹配任务依赖关系。
|
|
|
|
|
|
当父任务执行结束并且执行成功时,将会根据“子任务Key”匹配子任务依赖,如果匹配到子任务,将会主动触发一次子任务的执行。
|
|
@@ -676,12 +681,12 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
|
|
|

|
|
|
|
|
|
-#### 5.5 任务 "运行模式" 剖析
|
|
|
-##### 5.5.1 "Bean模式" 任务
|
|
|
+### 5.5 任务 "运行模式" 剖析
|
|
|
+#### 5.5.1 "Bean模式" 任务
|
|
|
开发步骤:可参考 "章节三" ;
|
|
|
原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHander(value="名称")”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。
|
|
|
|
|
|
-##### 5.5.2 "GLUE模式(Java)" 任务
|
|
|
+#### 5.5.2 "GLUE模式(Java)" 任务
|
|
|
开发步骤:可参考 "章节三" ;
|
|
|
原理:每个 "GLUE模式(Java)" 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。
|
|
|
|
|
@@ -695,7 +700,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
- python脚本:任务运行模式选择为 "GLUE模式(Python)"时支持 "python" 脚本任务;
|
|
|
|
|
|
|
|
|
-##### 5.5.4 执行器
|
|
|
+#### 5.5.4 执行器
|
|
|
执行器实际上是一个内嵌的Jetty服务器,默认端口9999,如下图配置文件所示(参数:xxl.job.executor.port)。
|
|
|
|
|
|

|
|
@@ -704,7 +709,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
|
|
|
“执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该“执行器”项目的Spring容器中),然后调用execute方法,执行任务逻辑。
|
|
|
|
|
|
-##### 5.5.5 任务日志
|
|
|
+#### 5.5.5 任务日志
|
|
|
XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 "XxlJobLogger.log" 打印执行日志,“调度中心”查看执行日志时将会加载对应的日志文件。
|
|
|
|
|
|
(历史版本通过重写LOG4J的Appender实现,存在依赖限制,该方式在新版本已经被抛弃)
|
|
@@ -713,17 +718,17 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
|
|
|
在JobHandler中开启子线程时,子线程将会将会把日志打印在父线程即JobHandler的执行日志中,方便日志追踪。
|
|
|
|
|
|
-#### 5.6 通讯模块剖析
|
|
|
+### 5.6 通讯模块剖析
|
|
|
|
|
|
-##### 5.6.1 一次完整的任务调度通讯流程
|
|
|
+#### 5.6.1 一次完整的任务调度通讯流程
|
|
|
- 1、“调度中心”向“执行器”发送http调度请求: “执行器”中接收请求的服务,实际上是一台内嵌jetty服务器,默认端口9999;
|
|
|
- 2、“执行器”执行任务逻辑;
|
|
|
- 3、“执行器”http回调“调度中心”调度结果: “调度中心”中接收回调的服务,是针对执行器开放一套API服务;
|
|
|
|
|
|
-##### 5.6.2 通讯数据加密
|
|
|
+#### 5.6.2 通讯数据加密
|
|
|
调度中心向执行器发送的调度请求时使用RequestModel和ResponseModel两个对象封装调度请求参数和响应数据, 在进行通讯之前底层会将上述两个对象对象序列化,并进行数据协议以及时间戳检验,从而达到数据加密的功能;
|
|
|
|
|
|
-#### 5.7 任务注册, 任务自动发现
|
|
|
+### 5.7 任务注册, 任务自动发现
|
|
|
自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
|
|
|
|
|
|
AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表;
|
|
@@ -732,12 +737,12 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
|
|
|
为保证系统"轻量级"并且降低学习部署成本,没有采用Zookeeper作为注册中心,采用DB方式进行任务注册发现;
|
|
|
|
|
|
-#### 5.8 任务执行结果
|
|
|
+### 5.8 任务执行结果
|
|
|
自v1.6.2之后,任务执行结果通过 "IJobHandler" 的返回值 "ReturnT" 进行判断;
|
|
|
当返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 时表示任务执行成功,否则表示任务执行失败,而且可以通过 "ReturnT.msg" 回调错误信息给调度中心;
|
|
|
从而,在任务逻辑中可以方便的控制任务执行结果;
|
|
|
|
|
|
-#### 5.9 分片广播 & 动态分片
|
|
|
+### 5.9 分片广播 & 动态分片
|
|
|
执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
|
|
|
|
|
|
"分片广播" 以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
|
|
@@ -755,7 +760,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
- 1、分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;
|
|
|
- 2、广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等
|
|
|
|
|
|
-#### 5、10 访问令牌(AccessToken)
|
|
|
+### 5.10 访问令牌(AccessToken)
|
|
|
为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;
|
|
|
|
|
|
调度中心和执行器,可通过配置项 "xxl.job.accessToken" 进行AccessToken的设置。
|
|
@@ -767,7 +772,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
|
|
|
|
|
|
## 六、版本更新日志
|
|
|
-#### 6.1 版本 V1.1.x,新特性[2015-12-05]
|
|
|
+### 6.1 版本 V1.1.x,新特性[2015-12-05]
|
|
|
**【于V1.1.x版本,XXL-JOB正式应用于我司,内部定制别名为 “Ferrari”,新接入应用推荐使用最新版本】**
|
|
|
- 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
|
|
|
- 2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效;
|
|
@@ -778,7 +783,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
- 7、支持自定义参数;
|
|
|
- 8、支持远程任务执行终止;
|
|
|
|
|
|
-#### 6.2 版本 V1.2.x,新特性[2016-01-17]
|
|
|
+### 6.2 版本 V1.2.x,新特性[2016-01-17]
|
|
|
- 1、支持任务分组;
|
|
|
- 2、支持“本地任务”、“远程任务”;
|
|
|
- 3、底层通讯支持两种方式,Servlet方式 + JETTY方式;
|
|
@@ -796,7 +801,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
- 高扩展性;
|
|
|
- 稳定性;
|
|
|
|
|
|
-#### 6.3 版本 V1.3.0,新特性[2016-05-19]
|
|
|
+### 6.3 版本 V1.3.0,新特性[2016-05-19]
|
|
|
- 1、遗弃“本地任务”模式,推荐使用“远程任务”,易于系统解耦,任务对应的JobHander统称为“执行器”;
|
|
|
- 2、遗弃“servlet”方式底层系统通讯,推荐使用JETTY方式,调度+回调双向通讯,重构通讯逻辑;
|
|
|
- 3、UI交互优化:左侧菜单展开状态优化,菜单项选中状态优化,任务列表打开表格有压缩优化;
|
|
@@ -806,7 +811,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
- BEAN模式执行器:每个执行器都是Spring的一个Bean实例,XXL-JOB通过注解@JobHander识别和调度执行器;
|
|
|
-GLUE模式执行器:每个执行器对应一段代码,在线Web编辑和维护,动态编译生效,执行器负责加载GLUE代码和执行;
|
|
|
|
|
|
-#### 6.4 版本 V1.3.1,新特性[2016-05-23]
|
|
|
+### 6.4 版本 V1.3.1,新特性[2016-05-23]
|
|
|
- 1、更新项目目录结构:
|
|
|
- /xxl-job-admin -------------------- 【调度中心】:负责管理调度信息,按照调度配置发出调度请求;
|
|
|
- /xxl-job-core ----------------------- 公共依赖
|
|
@@ -816,12 +821,12 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
- 2、在新的目录结构上,升级了用户手册;
|
|
|
- 3、优化了一些交互和UI;
|
|
|
|
|
|
-#### 6.5 版本 V1.3.2,新特性[2016-05-28]
|
|
|
+### 6.5 版本 V1.3.2,新特性[2016-05-28]
|
|
|
- 1、调度逻辑进行事务包裹;
|
|
|
- 2、执行器异步回调执行日志;
|
|
|
- 3、【重要】在 “调度中心” 支持HA的基础上,扩展执行器的Failover支持,支持配置多执行期地址;
|
|
|
|
|
|
-#### 6.6 版本 V1.4.0 新特性[2016-07-24]
|
|
|
+### 6.6 版本 V1.4.0 新特性[2016-07-24]
|
|
|
- 1、任务依赖: 通过事件触发方式实现, 任务执行成功并回调时会主动触发一次子任务的调度, 多个子任务用逗号分隔;
|
|
|
- 2、执行器底层实现代码进行重度重构, 优化底层建表脚本;
|
|
|
- 3、执行器中任务线程分组逻辑优化: 之前根据执行器JobHandler进行线程分组,当多个任务复用Jobhanlder会导致相互阻塞。现改为根据调度中心任务进行任务线程分组,任务与任务执行相互隔离;
|
|
@@ -840,7 +845,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
|
|
|
|
|
|
Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段, 地址见分支 [V1.3](https://github.com/xuxueli/xxl-job/tree/v1.3) 。新特性将会在master分支持续更新。
|
|
|
|
|
|
-#### 6.7 版本 V1.4.1 新特性[2016-09-06]
|
|
|
+### 6.7 版本 V1.4.1 新特性[2016-09-06]
|
|
|
- 1、项目成功推送maven中央仓库, 中央仓库地址以及依赖如下:
|
|
|
```
|
|
|
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
|
|
@@ -858,14 +863,14 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 7、底层表结构,表明统一大写;
|
|
|
- 8、调度中心,异常处理器JSON响应的ContentType修改,修复浏览器不识别的问题;
|
|
|
|
|
|
-#### 6.8 版本 V1.4.2 新特性[2016-09-29]
|
|
|
+### 6.8 版本 V1.4.2 新特性[2016-09-29]
|
|
|
- 1、推送新版本 V1.4.2 至中央仓库, 大版本 V1.4 进入维护阶段;
|
|
|
- 2、任务新增时,任务列表偏移问题修复;
|
|
|
- 3、修复一处因bootstrap不支持模态框重叠而导致的样式错乱的问题, 在任务编辑时会出现该问题;
|
|
|
- 4、调度超时和Handler匹配不到时,调度状态优化;
|
|
|
- 5、因catch异常,导致任务不可终止的问题,给出解决方案, 见文档;
|
|
|
|
|
|
-#### 6.9 版本 V1.5.0 特性[2016-11-13]
|
|
|
+### 6.9 版本 V1.5.0 特性[2016-11-13]
|
|
|
- 1、任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。
|
|
|
- 2、"执行器" 新增参数 "AppName" : 是每个执行器集群的唯一标示AppName, 并周期性以AppName为对象进行自动注册。
|
|
|
- 3、调度中心新增栏目 "执行器管理" : 管理在线的执行器, 通过属性AppName自动发现注册的执行器。只有被管理的执行器才允许被使用;
|
|
@@ -875,14 +880,14 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 7、表结构调整,底层重构优化;
|
|
|
- 8、"调度中心"自动注册和发现,failover: 调度中心周期性自动注册, 任务回调时可以感知在线的所有调度中心地址, 通过failover的方式进行任务回调,避免回调单点风险。
|
|
|
|
|
|
-#### 6.10 版本 V1.5.1 特性[2016-11-13]
|
|
|
+### 6.10 版本 V1.5.1 特性[2016-11-13]
|
|
|
- 1、底层代码重构和逻辑优化,POM清理以及CleanCode;
|
|
|
- 2、Servlet/JSP Spec设定为3.0/2.2
|
|
|
- 3、Spring升级至3.2.17.RELEASE版本;
|
|
|
- 4、Jetty升级版本至8.2.0.v20160908;
|
|
|
- 5、已推送V1.5.0和V1.5.1至Maven中央仓库;
|
|
|
|
|
|
-#### 6.10 版本 V1.5.2 特性[2017-02-28]
|
|
|
+### 6.10 版本 V1.5.2 特性[2017-02-28]
|
|
|
- 1、IP工具类获取IP逻辑优化,IP静态缓存;
|
|
|
- 2、执行器、调度中心,均支持自定义注册IP地址;解决机器多网卡时错误网卡注册的情况;
|
|
|
- 3、任务跨天执行时生成多份日志文件的问题修复;
|
|
@@ -892,7 +897,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 7、底层代码重构和逻辑优化以及CleanCode;
|
|
|
- 8、GLUE依赖注入逻辑优化,支持别名注入;
|
|
|
|
|
|
-#### 6.11 版本 V1.6.0 特性[2017-03-13]
|
|
|
+### 6.11 版本 V1.6.0 特性[2017-03-13]
|
|
|
- 1、通讯方案升级,原基于HEX的通讯模型调整为基于HTTP的B-RPC的通讯模型;
|
|
|
- 2、执行器支持手动设置执行地址列表,提供开关切换使用注册地址还是手动设置的地址;
|
|
|
- 3、执行器路由规则:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移;
|
|
@@ -903,20 +908,20 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 8、新建任务默认为非运行状态;
|
|
|
- 9、GLUE模式任务实例更新逻辑优化,原根据超时时间更新改为根据版本号更新,源码变动版本号加一;
|
|
|
|
|
|
-#### 6.12 版本 V1.6.1 特性[2017-03-25]
|
|
|
+### 6.12 版本 V1.6.1 特性[2017-03-25]
|
|
|
- 1、Rolling日志;
|
|
|
- 2、WebIDE交互重构;
|
|
|
- 3、通讯增强校验,有效过滤非正常请求;
|
|
|
- 4、权限增强校验,采用动态登录TOKEN(推荐接入内部SSO);
|
|
|
- 5、数据库配置优化,解决乱码问题;
|
|
|
|
|
|
-#### 6.13 版本 V1.6.2 特性[2017-04-25]
|
|
|
+### 6.13 版本 V1.6.2 特性[2017-04-25]
|
|
|
- 1、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
|
|
|
- 2、JobHandler支持设置任务返回值,在任务逻辑中可以方便的控制任务执行结果;
|
|
|
- 3、资源路径包含空格或中文时资源文件无法加载时,无法准确查看异常信息的问题处理。
|
|
|
- 4、路由策越优化:循环和LFU路由策略计数器自增无上限问题和首次路由压力集中在首台机器的问题修复;
|
|
|
|
|
|
-#### 6.14 版本 V1.7.0 特性[2017-05-02]
|
|
|
+### 6.14 版本 V1.7.0 特性[2017-05-02]
|
|
|
- 1、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python和Groovy等类型脚本;
|
|
|
- 2、新增spring-boot类型执行器example项目;
|
|
|
- 3、升级jetty版本至9.2;
|
|
@@ -924,7 +929,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 5、执行器移除GlueLoader依赖,改为推送方式实现,从而GLUE源码加载不再依赖JDBC;
|
|
|
- 6、登录拦截Redirect时获取项目名,解决非根据目录发布时跳转404问题;
|
|
|
|
|
|
-#### 6.15 版本 V1.7.1 特性[2017-05-08]
|
|
|
+### 6.15 版本 V1.7.1 特性[2017-05-08]
|
|
|
- 1、运行日志读写编码统一为UTF-8,解决windows环境下日志乱码问题;
|
|
|
- 2、通讯超时时间限定为10s,避免异常情况下调度线程占用;
|
|
|
- 3、执行器,server启动、销毁和注册逻辑调整;
|
|
@@ -934,7 +939,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 7、弹框组件统一替换为layer;
|
|
|
- 8、升级quartz版本至2.3.0;
|
|
|
|
|
|
-#### 6.16 版本 V1.7.2 特性[2017-05-17]
|
|
|
+### 6.16 版本 V1.7.2 特性[2017-05-17]
|
|
|
- 1、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
|
|
|
- 2、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
|
|
|
- 3、通讯时间戳超时时间调整为180s;
|
|
@@ -942,7 +947,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 5、执行参数编辑时丢失问题修复;
|
|
|
- 6、新增任务测试Demo,方便在开发时进行任务逻辑测试;
|
|
|
|
|
|
-#### 6.17 版本 V1.8.0 特性[2017-07-17]
|
|
|
+### 6.17 版本 V1.8.0 特性[2017-07-17]
|
|
|
- 1、任务Cron更新逻辑优化,改为rescheduleJob,同时防止cron重复设置;
|
|
|
- 2、API回调服务失败状态码优化,方便问题排查;
|
|
|
- 3、XxlJobLogger的日志多参数支持;
|
|
@@ -955,7 +960,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 10、执行日志,支持根据运行 "状态" 筛选日志;
|
|
|
- 11、调度中心任务注册检测逻辑优化;
|
|
|
|
|
|
-#### 6.18 版本 V1.8.1 特性[2017-07-30]
|
|
|
+### 6.18 版本 V1.8.1 特性[2017-07-30]
|
|
|
- 1、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数处理分片任务;
|
|
|
- 2、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
|
|
|
- 3、执行器JobHandler禁止命名冲突;
|
|
@@ -968,12 +973,12 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
- 10、springboot版本执行器,升级至1.5.6.RELEASE版本;
|
|
|
- 11、统一maven依赖版本管理;
|
|
|
|
|
|
-#### 6.18 版本 V1.8.2 特性[Coding]
|
|
|
+### 6.18 版本 V1.8.2 特性[Coding]
|
|
|
- 1、解决执行器回调URL不支持配置HTTPS时问题;
|
|
|
- 2、规范项目目录,方便扩展多执行器;
|
|
|
- 3、新增JFinal类型执行器sample示例项目;
|
|
|
|
|
|
-#### TODO LIST
|
|
|
+### TODO LIST
|
|
|
- 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
|
|
|
- 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定;
|
|
|
- 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,待定。
|
|
@@ -987,21 +992,20 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|
|
|
|
|
## 七、其他
|
|
|
|
|
|
-#### 7.1 报告问题
|
|
|
-XXL-JOB托管在Github上,如有问题可在 [ISSUES](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群;
|
|
|
+### 7.1 项目贡献
|
|
|
+欢迎参与项目贡献!比如提交PR修复一个bug,或者新建 [Issue](https://github.com/xuxueli/xxl-job/issues/) 讨论新特性或者变更。
|
|
|
|
|
|
-#### 7.2 用户接入登记
|
|
|
-登记仅为了产品推广,产品开源免费。
|
|
|
-请接入使用的公司或个人进行用户登记 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 。
|
|
|
+### 7.2 用户接入登记
|
|
|
+更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
|
|
|
|
|
|
-#### 7.3 开源协议和版权
|
|
|
+### 7.3 开源协议和版权
|
|
|
产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。
|
|
|
|
|
|
-XXL-JOB采用GPLv3协议,目的是为了保证用户的自由使用权利。协议可避免专利申请的特殊危险 "the GPL assures that patents cannot be used to render the program non-free.(摘自GPLv3)"。
|
|
|
-Copyright (c) 2015-present, xuxueli.
|
|
|
+- Licensed under the GNU General Public License (GPL) v3.
|
|
|
+- Copyright (c) 2015-present, xuxueli.
|
|
|
|
|
|
---
|
|
|
-#### 捐赠
|
|
|
+### 捐赠
|
|
|
支持的话可以扫一扫,请作者喝杯咖啡吧:)
|
|
|
|
|
|
微信:
|