|
|
|
|
64
|
- 20、博莹科技(上海)有限公司
|
64
|
- 20、博莹科技(上海)有限公司
|
65
|
- 21、成都依能股份有限责任公司
|
65
|
- 21、成都依能股份有限责任公司
|
66
|
- 22、湖南高阳通联信息技术有限公司
|
66
|
- 22、湖南高阳通联信息技术有限公司
|
|
|
67
|
+ - 23、深圳市邦德文化发展有限公司
|
67
|
- ……
|
68
|
- ……
|
68
|
|
69
|
|
69
|
欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
|
70
|
欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
|
|
|
|
|
98
|
|
99
|
|
99
|
#### Download: 历史Release版本下载位置如下图所示,请自行前往进行选择和下载。
|
100
|
#### Download: 历史Release版本下载位置如下图所示,请自行前往进行选择和下载。
|
100
|
|
101
|
|
101
|
-
|
|
|
|
|
102
|
+
|
102
|
|
103
|
|
103
|
### 1.5 环境
|
104
|
### 1.5 环境
|
104
|
- JDK:1.7+
|
105
|
- JDK:1.7+
|
|
|
|
|
112
|
## 二、快速入门
|
113
|
## 二、快速入门
|
113
|
|
114
|
|
114
|
### 2.1 初始化“调度数据库”
|
115
|
### 2.1 初始化“调度数据库”
|
115
|
-请下载项目源码并解压,获取 "调度数据库初始化SQL脚本"(脚本文件为: 源码解压根目录\xxl-job\db\tables_xxl_job.sql) 并执行即可。正常情况下,应该生成如下图所示16张表;
|
|
|
|
|
116
|
+请下载项目源码并解压,获取 "调度数据库初始化SQL脚本"(脚本文件为: 源码解压根目录\xxl-job\db\tables_xxl_job.sql) 并执行即可。正常情况下,应该生成16张表;
|
116
|
|
117
|
|
117
|
-
|
|
|
|
|
118
|
+调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;
|
118
|
|
119
|
|
119
|
-调度中心集群情况下,集群节点务必连接同一个mysql实例;如果mysql做主从,调度中心集群节点务必强制走主库;
|
|
|
|
|
120
|
+如果mysql做主从,调度中心集群节点务必强制走主库;
|
120
|
|
121
|
|
121
|
### 2.2 编译源码
|
122
|
### 2.2 编译源码
|
122
|
解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下图所示:
|
123
|
解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下图所示:
|
123
|
|
124
|
|
124
|
-
|
|
|
|
|
125
|
+
|
125
|
|
126
|
|
126
|
- - xxl-job-admin:调度中心
|
|
|
127
|
- - xxl-job-core:公共依赖
|
|
|
128
|
- - xxl-job-executor-example:执行器(可直接使用该执行器,也可以将现有项目改造成执行器使用)
|
|
|
|
|
127
|
+ xxl-job-admin:调度中心
|
|
|
128
|
+ xxl-job-core:公共依赖
|
|
|
129
|
+ xxl-job-executor-example:执行器Example(可直接使用执行器Example,也可以将现有项目改造成执行器使用)
|
|
|
130
|
+ xxl-job-executor-springboot-example:执行器Example,springboot版本
|
129
|
|
131
|
|
130
|
### 2.3 配置部署“调度中心”
|
132
|
### 2.3 配置部署“调度中心”
|
131
|
|
133
|
|
|
|
|
|
135
|
#### 调度中心配置:
|
137
|
#### 调度中心配置:
|
136
|
配置文件以及配置属性如下图所示。
|
138
|
配置文件以及配置属性如下图所示。
|
137
|
|
139
|
|
138
|
-
|
|
|
139
|
-
|
|
|
|
|
140
|
+
|
|
|
141
|
+
|
|
|
142
|
+
|
140
|
### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
|
143
|
### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
|
141
|
xxl.job.db.driverClass=com.mysql.jdbc.Driver
|
144
|
xxl.job.db.driverClass=com.mysql.jdbc.Driver
|
142
|
xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
|
145
|
xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
|
143
|
xxl.job.db.user=root
|
146
|
xxl.job.db.user=root
|
144
|
xxl.job.db.password=root_pwd
|
147
|
xxl.job.db.password=root_pwd
|
145
|
|
148
|
|
146
|
- ### “调度中心”任务回调服务地址:“执行器”将会回调该地址通知任务执行结果,改地址将会用于回调服务注册。回调服务默认端口为8888,回调IP默认为空表示自动获取IP,多网卡时可手动设置指定IP;
|
|
|
147
|
- xxl.job.callBackIp=
|
|
|
148
|
- xxl.job.callBackPort=8888
|
|
|
149
|
-
|
|
|
150
|
### 报警邮箱
|
149
|
### 报警邮箱
|
151
|
xxl.job.mail.host=smtp.163.com
|
150
|
xxl.job.mail.host=smtp.163.com
|
152
|
xxl.job.mail.port=25
|
151
|
xxl.job.mail.port=25
|
|
|
|
|
175
|
#### 执行器配置:
|
174
|
#### 执行器配置:
|
176
|
配置文件以及配置属性如下图所示。
|
175
|
配置文件以及配置属性如下图所示。
|
177
|
|
176
|
|
178
|
-
|
|
|
|
|
177
|
+
|
179
|
|
178
|
|
180
|
|
179
|
|
181
|
- ### xxl-job db:执行器JDBC链接:请保持和调度中心JDBC连接配置一致;(执行器 "DbRegistHelper" 依赖JDBC配置;推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置; )
|
|
|
182
|
- xxl.job.db.driverClass=com.mysql.jdbc.Driver
|
|
|
183
|
- xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
|
|
|
184
|
- xxl.job.db.user=root
|
|
|
185
|
- xxl.job.db.password=root_pwd
|
|
|
|
|
180
|
+ ### xxl-job admin address list:调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。
|
|
|
181
|
+ xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
|
186
|
|
182
|
|
187
|
- ### xxl-job executor address:执行器"AppName"和地址信息配置:AppName为执行器分组依据。“调度中心”将会请求该地址触发任务,改地址将会用于执行器注册。执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP;
|
|
|
|
|
183
|
+ ### xxl-job executor address:执行器"AppName"和地址信息配置:AppName执行器心跳注册分组依据;地址信息用于"调度中心请求并触发任务"和"执行器注册"。执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP;
|
188
|
xxl.job.executor.appname=xxl-job-executor-example
|
184
|
xxl.job.executor.appname=xxl-job-executor-example
|
189
|
xxl.job.executor.ip=
|
185
|
xxl.job.executor.ip=
|
190
|
xxl.job.executor.port=9999
|
186
|
xxl.job.executor.port=9999
|
|
|
|
|
196
|
#### 组件配置:
|
192
|
#### 组件配置:
|
197
|
配置内容如下图所示。
|
193
|
配置内容如下图所示。
|
198
|
|
194
|
|
199
|
-
|
|
|
|
|
195
|
+
|
200
|
|
196
|
|
201
|
1、JobHandler 扫描路径:自动扫描容器中JobHandler;
|
197
|
1、JobHandler 扫描路径:自动扫描容器中JobHandler;
|
202
|
- 2、执行器注册器(XxlJobExecutor.registHelper): 默认使用系统提供的 "DbRegistHelper"(依赖JDBC), 推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置; )
|
|
|
203
|
- 3、XXL-JOB公共数据源 "xxlJobDataSource": 仅在启动 "DbRegistHelper" 或 "DbGlueLoader" 时才需要, 否则可删除
|
|
|
|
|
198
|
+ 2、执行器注册器:执行器核心配置;
|
204
|
|
199
|
|
205
|
#### 部署项目:
|
200
|
#### 部署项目:
|
206
|
至此“执行器”项目已经部署结束。
|
201
|
至此“执行器”项目已经部署结束。
|
|
|
|
|
541
|
```
|
536
|
```
|
542
|
|
537
|
|
543
|
##### 5.4.7 日志回调服务
|
538
|
##### 5.4.7 日志回调服务
|
544
|
-调度模块的“调度中心”作为Web服务单独部署,除此之外,内部嵌入jetty服务器提供日志回调服务。
|
|
|
|
|
539
|
+调度模块的“调度中心”作为Web服务部署时,一方面承担调度中心功能,另一方面页为执行器提供API服务。
|
545
|
|
540
|
|
546
|
-“执行器”在接收到任务执行请求后,执行任务,在执行结束之后会将执行结果回调通知“调度中心”,回调端口如下图所示(参数:xxl.job.callBackPort)。
|
|
|
|
|
541
|
+调度中心提供的"日志回调服务API服务"代码位置如下:
|
|
|
542
|
+```
|
|
|
543
|
+xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
|
|
|
544
|
+```
|
547
|
|
545
|
|
548
|
-
|
|
|
|
|
546
|
+“执行器”在接收到任务执行请求后,执行任务,在执行结束之后会将执行结果回调通知“调度中心”,代码位置为:
|
549
|
|
547
|
|
550
|
##### 5.4.8 任务HA(Failover)
|
548
|
##### 5.4.8 任务HA(Failover)
|
551
|
执行器如若集群部署,调度中心将会感知到在线的所有执行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。
|
549
|
执行器如若集群部署,调度中心将会感知到在线的所有执行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。
|
552
|
|
550
|
|
553
|
当任务"路由策略"选择"故障转移(FAILOVER)"时,当调度中心每次发起调度请求时,会按照顺序对执行器发出心跳检测请求,第一个检测为存活状态的执行器将会被选定并发送调度请求。
|
551
|
当任务"路由策略"选择"故障转移(FAILOVER)"时,当调度中心每次发起调度请求时,会按照顺序对执行器发出心跳检测请求,第一个检测为存活状态的执行器将会被选定并发送调度请求。
|
554
|
-
|
|
|
|
|
552
|
+
|
555
|
|
553
|
|
556
|
调度成功后,可在日志监控界面查看“调度备注”,如下;
|
554
|
调度成功后,可在日志监控界面查看“调度备注”,如下;
|
557
|

|
555
|

|
|
|
|
|
591
|
|
589
|
|
592
|

|
590
|

|
593
|
|
591
|
|
594
|
-#### 5.5 执行模块剖析
|
|
|
595
|
-##### 5.5.1 Bean模式任务
|
|
|
596
|
-开发步骤:见章节三;
|
|
|
|
|
592
|
+#### 5.5 任务 "运行模式" 剖析
|
|
|
593
|
+##### 5.5.1 "Bean模式" 任务
|
|
|
594
|
+开发步骤:可参考 "章节三" ;
|
597
|
原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHander(value="名称")”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。
|
595
|
原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHander(value="名称")”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。
|
598
|
|
596
|
|
599
|
-##### 5.5.2 GLUE模式任务
|
|
|
600
|
-开发步骤:见章节三;
|
|
|
601
|
-原理:每个Glue任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。
|
|
|
|
|
597
|
+##### 5.5.2 "GLUE模式(Java)" 任务
|
|
|
598
|
+开发步骤:可参考 "章节三" ;
|
|
|
599
|
+原理:每个 "GLUE模式(Java)" 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。
|
|
|
600
|
+
|
|
|
601
|
+#### 5.5.3 GLUE模式(Shell) + GLUE模式(Python)
|
|
|
602
|
+开发步骤:可参考 "章节三" ;
|
|
|
603
|
+原理:脚本任务的源码托管在调度中心,脚本逻辑在执行器运行。当触发脚本任务时,执行器会加载脚本源码在执行器机器上生成一份脚本文件,然后通过Java代码调用该脚本;并且实时将脚本输出日志写到任务日志文件中,从而在调度中心可以实时监控脚本运行情况;脚本返回码为0时表示执行成功,其他标示执行失败。
|
602
|
|
604
|
|
603
|
-##### 5.5.3 执行器
|
|
|
|
|
605
|
+目前支持的脚本类型如下:
|
|
|
606
|
+
|
|
|
607
|
+ - shell脚本:任务运行模式选择为 "GLUE模式(Shell)"时支持 "shell" 脚本任务;
|
|
|
608
|
+ - python脚本:任务运行模式选择为 "GLUE模式(Python)"时支持 "python" 脚本任务;
|
|
|
609
|
+
|
|
|
610
|
+
|
|
|
611
|
+##### 5.5.4 执行器
|
604
|
执行器实际上是一个内嵌的Jetty服务器,默认端口9999,如下图配置文件所示(参数:xxl.job.executor.port)。
|
612
|
执行器实际上是一个内嵌的Jetty服务器,默认端口9999,如下图配置文件所示(参数:xxl.job.executor.port)。
|
605
|
|
613
|
|
606
|

|
614
|

|
|
|
|
|
609
|
|
617
|
|
610
|
“执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该“执行器”项目的Spring容器中),然后调用execute方法,执行任务逻辑。
|
618
|
“执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该“执行器”项目的Spring容器中),然后调用execute方法,执行任务逻辑。
|
611
|
|
619
|
|
612
|
-##### 5.5.4 任务日志
|
|
|
|
|
620
|
+##### 5.5.5 任务日志
|
613
|
XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 "XxlJobLogger.log" 打印执行日志,“调度中心”查看执行日志时将会加载对应的日志文件。
|
621
|
XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 "XxlJobLogger.log" 打印执行日志,“调度中心”查看执行日志时将会加载对应的日志文件。
|
614
|
|
622
|
|
615
|
(历史版本通过重写LOG4J的Appender实现,存在依赖限制,该方式在新版本已经被抛弃)
|
623
|
(历史版本通过重写LOG4J的Appender实现,存在依赖限制,该方式在新版本已经被抛弃)
|
|
|
|
|
623
|
##### 5.6.1 一次完整的任务调度通讯流程
|
631
|
##### 5.6.1 一次完整的任务调度通讯流程
|
624
|
- 1、“调度中心”向“执行器”发送http调度请求: “执行器”中接收请求的服务,实际上是一台内嵌jetty服务器,默认端口9999;
|
632
|
- 1、“调度中心”向“执行器”发送http调度请求: “执行器”中接收请求的服务,实际上是一台内嵌jetty服务器,默认端口9999;
|
625
|
- 2、“执行器”执行任务逻辑;
|
633
|
- 2、“执行器”执行任务逻辑;
|
626
|
- - 3、“执行器”http回调“调度中心”调度结果: “调度中心”中接收回调的服务,实际上是一台内嵌jetty服务器,默认端口8888;
|
|
|
|
|
634
|
+ - 3、“执行器”http回调“调度中心”调度结果: “调度中心”中接收回调的服务,是针对执行器开放一套API服务;
|
627
|
|
635
|
|
628
|
##### 5.6.2 通讯数据加密
|
636
|
##### 5.6.2 通讯数据加密
|
629
|
-调度中心与执行器之间使用RequestModel和ResponseModel两个对象封装调度请求参数和响应数据, 在进行通讯之前底层会将上述两个对象对象序列化字节数组,最终转化成16进制数据进行数据交互,从而达到数据加密的功能;
|
|
|
|
|
637
|
+调度中心向执行器发送的调度请求时使用RequestModel和ResponseModel两个对象封装调度请求参数和响应数据, 在进行通讯之前底层会将上述两个对象对象序列化,并进行数据协议以及时间戳检验,从而达到数据加密的功能;
|
630
|
|
638
|
|
631
|
#### 5.7 任务注册, 任务自动发现
|
639
|
#### 5.7 任务注册, 任务自动发现
|
632
|
自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
|
640
|
自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
|
|
|
|
|
654
|
当返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 时表示任务执行成功,否则表示任务执行失败,而且可以通过 "ReturnT.msg" 回调错误信息给调度中心;
|
662
|
当返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 时表示任务执行成功,否则表示任务执行失败,而且可以通过 "ReturnT.msg" 回调错误信息给调度中心;
|
655
|
从而,在任务逻辑中可以方便的控制任务执行结果;
|
663
|
从而,在任务逻辑中可以方便的控制任务执行结果;
|
656
|
|
664
|
|
657
|
-#### 5.10 脚本任务
|
|
|
658
|
-目前支持的脚本类型如下,脚本任务可参考章节 "三、任务详解":
|
|
|
659
|
-
|
|
|
660
|
- - shell脚本:任务运行模式选择为 "GLUE模式(Shell)"时支持 "shell" 脚本任务;
|
|
|
661
|
- - python脚本:任务运行模式选择为 "GLUE模式(Python)"时支持 "python" 脚本任务;
|
|
|
662
|
-
|
|
|
663
|
-脚本任务的源码托管在调度中心,脚本逻辑在执行器运行。当触发脚本任务时,执行器会加载脚本源码在执行器机器上生成一份脚本文件,然后通过Java代码调用该脚本;
|
|
|
664
|
-并且实时将脚本输出日志写到任务日志文件中,从而在调度中心可以实时监控脚本运行情况;
|
|
|
665
|
-
|
|
|
666
|
-脚本返回码为0时表示执行成功,其他标示执行失败。
|
|
|
667
|
|
665
|
|
668
|
## 六、版本更新日志
|
666
|
## 六、版本更新日志
|
669
|
#### 6.1 版本 V1.1.x,新特性[2015-12-05]
|
667
|
#### 6.1 版本 V1.1.x,新特性[2015-12-05]
|