diff --git a/README.md b/README.md
index 6d847fc0..0cf49c32 100644
--- a/README.md
+++ b/README.md
@@ -37,8 +37,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
## Documentation
-- [中文文档](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB官方文档.md)
-- [English Documentation](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB-English-Documentation.md)
+- [中文文档](http://www.xuxueli.com/xxl-job/)
+- [English Documentation](http://www.xuxueli.com/xxl-job/en/)
## Features
diff --git a/doc/XXL-JOB-English-Documentation.md b/doc/XXL-JOB-English-Documentation.md
index e3717b6e..fe1352cd 100644
--- a/doc/XXL-JOB-English-Documentation.md
+++ b/doc/XXL-JOB-English-Documentation.md
@@ -1,4 +1,4 @@
-# 《A lightweight distributed task scheduling framework. "XXL-JOB"》
+# 《Distributed task scheduling framework XXL-JOB》
[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/)
@@ -41,8 +41,9 @@ In 2015 - November, XXL-JOB finally RELEASE the first big version of V1.0, then
In 2015 - December, I will XXL-JOB published to our internal knowledge base, and get internal colleagues recognized.
In 2016 - 01 months, my company started XXL-JOB internal access and custom work, in this thank Yuan and Yin two colleagues contribution, but also to thank the internal other attention and support colleagues.
In 2017-05-13, the link of "let the code run" in "[the 62nd source of open source China Genesis](https://www.oschina.net/event/2236961)" held in Shanghai,, I stepped on and made a speech about the XXL-JOB, five hundred spectators in the audience reacted enthusiastically ([pictorial review](https://www.oschina.net/question/2686220_2242120)).
-#### My company have access to XXL-JOB, internal alias "Ferrari" (Ferrari based on XXL-JOB V1.1 version customization, new access application recommended to upgrade the latest version).
+> Our company have access to XXL-JOB, internal alias "Ferrari" (Ferrari based on XXL-JOB V1.1 version customization, new access application recommended to upgrade the latest version).
According to the latest statistics, from 2016-01-21 to 2017-07-07 period, the system has been scheduled about 600,000 times, outstanding performance. New access applications recommend the latest version, because after several major updates, the system's task model, UI interaction model and the underlying scheduling communication model has a greater optimization and upgrading, the core function more stable and efficient.
+
So far, XXL-JOB has access to a number of companies online product line, access to scenes such as electronic commerce, O2O business and large data operations, as of 2016-07-19, XXL-JOB has access to the company But not limited to:
- 1、大众点评;
@@ -82,11 +83,17 @@ So far, XXL-JOB has access to a number of companies online product line, access
- 35、北京诺亦腾科技有限公司
- 36、增长引擎(北京)信息技术有限公司
- ……
-
+
+> The company that access and use this product is welcome to register at the [address](https://github.com/xuxueli/xxl-job/issues/1 ), only for product promotion.
+
Welcome everyone's attention and use, XXL-JOB will also embrace changes, sustainable development.
### 1.4 Download
+#### Documentation
+- [中文文档](http://www.xuxueli.com/xxl-job/)
+- [English Documentation](http://www.xuxueli.com/xxl-job/en/)
+
#### Source repository address (The latest code will be released in the two git warehouse in the same time)
Source repository address | Release Download
@@ -104,19 +111,15 @@ Source repository address | Release Download
```
-#### Blog address
-
-- [oschina address](http://my.oschina.net/xuxueli/blog/690978)
-- [cnblogs address](http://www.cnblogs.com/xuxueli/p/5021979.html)
-
#### Technical exchange group (technical exchange only)
-- Group 6:399758605
-- Group 5:138274130 (Group is full, please add group 6)
-- Group 4:464762661 (Group is full, please add group 6)
-- Group 3:242151780 (Group is full, please add group 6)
-- Group 2:438249535 (Group is full, please add group 6)
-- Group 1:367260654 (Group is full, please add group 6)
+- Tecent QQ Group 6:399758605
+- Tecent QQ Group 5:138274130
+- Tecent QQ Group 4:464762661
+- Tecent QQ Group 3:242151780
+- Tecent QQ Group 2:438249535
+- Tecent QQ Group 1:367260654
+- [Gitter](https://gitter.im/xuxueli/xxl-job)
### 1.5 Environment
- JDK:1.7+
@@ -399,7 +402,7 @@ Actually it is a python script fragment.
## 4. Task Management
-#### 4.0 configure executor
+### 4.0 configure executor
click"执行器管理" on the left menu,it will go to the page as shown below:
![输入图片说明](https://static.oschina.net/uploads/img/201703/12223509_Hr2T.png "在这里输入图片标题")
@@ -409,7 +412,7 @@ click"执行器管理" on the left menu,it will go to the page as shown below:
If you want to create a new executor,please click "+新增执行器" button:
![输入图片说明](https://static.oschina.net/uploads/img/201703/12223617_g3Im.png "在这里输入图片标题")
-#### Description of executor attributes
+### Description of executor attributes
AppName: the unique identity of the executor cluster,executor will registe automatically and periodically by appName so that it can be scheduled.
名称: the name of ther executor,it is used to describe the executor.
@@ -419,29 +422,29 @@ If you want to create a new executor,please click "+新增执行器" button:
手动录入:fill in executor address manually and it will be used by schedule center, multiple address separated by commas.
机器地址:only effective when "注册方式" is "手动录入",support fill in executor address manually.
-#### 4.1 create new task
+### 4.1 create new task
Go to task management list page,click “新增任务” button on the upper right corner,on the pop-up window“新增任务”page configure task property and save.learn more info please go and see "3,task details".
-#### 4.2 edit task
+### 4.2 edit task
Go to task management list page and choose the task you want to edit ,click”编辑”button on the right side of the task,on the pop-up window “编辑任务”page edit task property and save.
-#### 4.3 edit GLUE source code
+### 4.3 edit GLUE source code
Only fit to GLUE task.
choose the task you want to edit and click” GLUE”button on the right side of the task, it will go to the Web IDE page of GLUE task,then you can edit task source code on this page.you can read "3.2 GLUE模式(Java)" for more info.
-#### 4.4 pause/recover task
+### 4.4 pause/recover task
You can pause or recover task but it just fit to follow up schedule trigger and won’t affect scheduled tasks,if you want to stop tasks which has been triggered,please go and see “4.8 stop the running task”
![输入图片说明](https://static.oschina.net/uploads/img/201607/24130337_ZAhX.png "在这里输入图片标题")
-#### 4.5 manually trigger
+### 4.5 manually trigger
You can trigger a task manually by Click “执行”button,it won’t affect original scheduling rules.
![输入图片说明](https://static.oschina.net/uploads/img/201607/24133348_Z5wp.png "在这里输入图片标题")
-#### 4.6 view schedule log
+### 4.6 view schedule log
You can view task’s history schedule log by click “日志” button,on the history schedule log list page you can view every time of task’s schedule result,execution result and so on,click “执行日志” button can view the task’s full execute log.
![输入图片说明](https://static.oschina.net/uploads/img/201607/24133500_9235.png "在这里输入图片标题")
@@ -461,12 +464,12 @@ You can view task’s history schedule log by click “日志” button,on the h
"执行日志"button:click this button you can view task’s execution detail log,go and see chapter 4.7 “view execution log” for more info;
"终止任务"button:click this button you can stop the task’s execution thread on this executor,include bloked task instance which didn’t has started;
-#### 4.7 view execution log
+### 4.7 view execution log
Click the “执行日志” button on the right side of the record,you can go to the execution log page,you can view the full execution log of the logic business code, shown as below:
![输入图片说明](https://static.oschina.net/uploads/img/201703/25124816_tvGI.png "在这里输入图片标题")
-#### 4.8 stop running tasks
+### 4.8 stop running tasks
Just fit to running tasks,on the task log list page,click “终止任务” button on the right side of the record, it will send stop command to the executor where the task was executed,finally the task was killed and the task instance execute queue of this task will be clear.
![输入图片说明](https://static.oschina.net/uploads/img/201607/24140048_hIci.png "在这里输入图片标题")
@@ -488,26 +491,26 @@ try{
If JobHandler start child thread,child thread also must not catch InterruptedException,and it should throw exception.
-#### 4.9 delete execution log
+### 4.9 delete execution log
On the task log list page, after you select executor and task, you can click"删除" button on the right side and it will pop-up "日志清理" window,on the pop-up window you can choose different log delete policy,choose the policy you want to execute and click "确定" button it will delele relative logs:
![输入图片说明](https://static.oschina.net/uploads/img/201705/08210711_Ypik.png "在这里输入图片标题")
![输入图片说明](https://static.oschina.net/uploads/img/201705/08211152_EB65.png "在这里输入图片标题")
-#### 4.10 delete task
+### 4.10 delete task
Click the delete button on the right side of the task,the task will be deteted.
![输入图片说明](https://static.oschina.net/uploads/img/201607/24140641_Z9Qr.png "在这里输入图片标题")
## 5. Overall design
-#### 5.1 Source directory introduction
+### 5.1 Source directory introduction
- /doc :documentation and material
- /db :db scripts
- /xxl-job-admin :schedule and admin center
- /xxl-job-core :common core Jar
- /xxl-job-executor-samples :executor,Demo project(you can develop on this demo project or adjust your own exist project to executor project)
-#### 5.2 configure database
+### 5.2 configure database
XXL-JOB schedule module is implemented based on Quartz cluster,it’s “database” is extended based on Quartz’s 11 mysql tables.
XXL-JOB custom Quartz table structure prefix(XXL_JOB_QRTZ_).
@@ -523,15 +526,15 @@ The added tables as shown below:
So XXL-JOB database total has 16 tables.
-#### 5.3 Architecture design
-##### 5.3.1 Design target
+### 5.3 Architecture design
+#### 5.3.1 Design target
All schedule behavior has been abstracted into “schedule center” common platform , it dosen’t include business logic and just responsible for starting schedule requests.
All tasks was abstracted into separate JobHandler and was managed by executors, executor is responsible for receiving schedule request and execute the relative JobHandler business.
So schedule and task can be decoupled from each other, by the way it can improve the overall stability and scalability of the system.
-##### 5.3.2 System composition
+#### 5.3.2 System composition
- **Schedule module(schedule center)**:
it is responsible for manage schedule info,send schedule request accord task configuration and it is not include an business code.schedule system decouple with the task, improve the overall stability and scalability of the system, at the same time schedule system performance is no longer limited to task modules.
Support visualization, simple and dynamic management schedule information, include create,update,delete, GLUE develop and task alarm and so on, All of the above operations will take effect in real time,support monitor schedule result and execution log and executor failover.
@@ -539,24 +542,24 @@ So schedule and task can be decoupled from each other, by the way it can improve
it is responsible for receive schedule request and execute task logic,task module focuses on the execution of the task, Development and maintenance is simpler and more efficient.
Receive execution request, end request and log request from schedule center.
-##### 5.3.3 Architecture diagram
+#### 5.3.3 Architecture diagram
![输入图片说明](https://static.oschina.net/uploads/img/201707/17190028_aEE2.png "在这里输入图片标题")
-#### 5.4 Schedule module analysis
-##### 5.4.1 Disadvantage of quartz
+### 5.4 Schedule module analysis
+#### 5.4.1 Disadvantage of quartz
Quartz is a good open source project and was often as the first choice for job schedule.Tasks was managed by api in quartz cluster so it can avoid some disadvantages of single quartz instance,but it also has some disadvantage as shown below:
- problem 1:it is not humane while operate task by call apill.
- problem 2:it is need to store business QuartzJobBean into database, System Invasion is quite serious.
- problem 3:schedule logic and couple with QuartzJobBean in the same project,it will lead a problem in case that if schedule tasks gradually increased and task logic gradually increased,under this situation the performance of the schedule system will be greatly limited by business.
XXL-JOB solve above problems of quartz.
-##### 5.4.2 RemoteHttpJobBean
+#### 5.4.2 RemoteHttpJobBean
Under Quartz develop,task logic often was maintained by QuartzJobBean, couple is very serious.in XXL-JOB"Schedule module" and "task module" are completely decoupled,all scheduled tasks in schedule module use the same QuartzJobBean called RemoteHttpJobBean.the params of the tasks was maintained in the extended tables,when trigger RemoteHttpJobBean,it will parse different params and start remote cal l and it wil call relative remote executor.
This call module is like RPC,RemoteHttpJobBean provide call proxy functionality,the executor is provided as remote service.
-##### 5.4.3 Schedule Center HA(Cluster)
+#### 5.4.3 Schedule Center HA(Cluster)
It is based on Quartz cluster,databse use Mysql;while QUARTZ task schedule is used in Clustered Distributed Concurrent Environment,all nodes will report task info and store into database.it will fetch trigger from database while execute task,if trigger name and execute time is the same only one node will execute the task.
```
@@ -568,7 +571,7 @@ org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000
```
-##### 5.4.4 Schedule threadpool
+#### 5.4.4 Schedule threadpool
Default threads in the threadpool is 10 so it can avoid task schedule delay because of single thread block.
```
@@ -582,12 +585,12 @@ business logic was executed on remote executor in XXL-JOB,schedule center just s
the logic of task in XXL-JOB schedule center is very light and single job average run time alaways under 100ms,(most is network time consume).so it can use limited threads to support a large mount of job run concurrently, 10 threads configured above can support at least 100 JOB normal execution.
-##### 5.4.5 @DisallowConcurrentExecution
+#### 5.4.5 @DisallowConcurrentExecution
This annotation is not used default by the schedule center of XXL-JOB schedule module, it use concurrent policy default,because RemoteHttpJobBean is common QuartzJobBean,so it greatly improve the capacity of schedule system and decrease the blocked chance of schedule module in the case of multi-threaded schedule.
Every schedule module was scheduled and executed parallel in XXL-JOB,but tasks in executor is executed serially and support stop task.
-##### 5.4.6 misfire
+#### 5.4.6 misfire
The handle policy when miss the job’s trigger time.
he reason may be:restart service,schedule thread was blocked by QuartzJobBean, threads was exhausted,some task enable @DisallowConcurrentExecution,the last schedule was blocked and next schedule was missed.
@@ -608,7 +611,7 @@ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobIn
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
```
-##### 5.4.7 log callback service
+#### 5.4.7 log callback service
When schedule center of the schedule module was deployed as web service, on one side it play as schedule center, on the other side it also provide api service for executor.
The source code location of schedule center’s “log callback api service” as shown below:
@@ -618,7 +621,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
Executor will execute task when it receive task execute request.it will notify the task execute result to schedule center when the task is done.
-##### 5.4.8 task HA(Failover)
+#### 5.4.8 task HA(Failover)
If executor project was deployed as cluster schedule center will known all online executor nodes,such as:“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”.
When "路由策略" select "故障转移(FAILOVER)",it will send heart beat check request in order while schedule center start schedule request. The first alive checked executor node will be selected and send schedule request to it.
@@ -629,7 +632,7 @@ When "路由策略" select "故障转移(FAILOVER)",it will send heart beat chec
“调度备注” will display local schedule route path、executor’s "注册方式"、"地址列表" and task’s "路由策略"。Under "故障转移(FAILOVER)" policy, schedule center take first address to do heartbeat detection, heat beat fail will automatically skip, the second address heart beat fail…… until the third address “127.0.0.1:9999” heart beat success, it was selected as target executor, then send schedule request to target executor, now the schedule process is end wait for the executor’s callback execution result.
-##### 5.4.9 schedule log
+#### 5.4.9 schedule log
Every time when task was scheduled in the schedule center it will record a task log, the task log include three part as shown below:
- 任务信息:include executor address、JobHandler and executor params,accord these parameters it can locate specific machine and task code that the task will be executed.
@@ -650,7 +653,7 @@ Schedule log stands fo single task schedule, attribute description is as follows
- 执行备注:task execute remark info in the executor,such as exception log.
- 执行日志:full execution log of the business code during execution of the task,go and see “4.7 view execution log”.
-##### 5.4.10 Task dependency
+#### 5.4.10 Task dependency
principle:every task has a task key in XXL-JOB, every task can configure property “child task Key”,it can match task dependency relationship through task key.
When parent task end execute and success, it will match child task dependency accord child task key, it will trigger child task execute once if it matched child task.
@@ -661,12 +664,12 @@ On the task log page ,you can see matched child task and triggered child task’
![输入图片说明](https://static.oschina.net/uploads/img/201607/24194212_jOAU.png "在这里输入图片标题")
-#### 5.5 Task "run mode" analysis
-##### 5.5.1 "Bean模式" task
+### 5.5 Task "run mode" analysis
+#### 5.5.1 "Bean模式" task
Development steps:go and see "chapter 3" .
principle: every Bean mode task is a Spring Bean instance and it is maintained in executor project’s Spring container. task class nedd to add “@JobHander(value="name")” annotation, because executor identify task bean instance in spring container through annotation. Task class nedd to implements interface IJobHandler, task logic code in method execute(), the task logic in execute() method will be executed when executor received a schedule request from schedule center.
-##### 5.5.2 "GLUE模式(Java)" task
+#### 5.5.2 "GLUE模式(Java)" task
Development steps:go and see "chapter 3" .
Principle : every "GLUE模式(Java)" task code is a class implemets interface IJobHandler, when executor received schedule request from schedule center these code will be loaded by Groovy classloader and instantiate into a Java object and inject spring bean service declared in this code at the same time(please confirm service and class reference in Glue code exist in executor project), then call the object’s execute() method and execute task logic.
@@ -680,7 +683,7 @@ All supported types of scripts as shown beloes:
- python script: python script task will be enabled when select " GLUE模式(Python)"as task run mode.
-##### 5.5.4 executor
+#### 5.5.4 executor
Executor is actually an embedded Jetty server with default port 9999, as shown below(parameter:xxl.job.executor.port).
![输入图片说明](https://static.oschina.net/uploads/img/201703/10174923_TgNO.png "在这里输入图片标题")
@@ -689,7 +692,7 @@ Executor will identify Bean mode task in spring container through @JobHander Whe
When executor received schedule request from schedule center, if task type is “Bean模式” it will match bean mode task in Spring container and call it’s execute() method and execute task logic. if task type is “GLUE模式”, it will load Glue code, instantiate a Java object and inject other spring service(notice: the spring service injected in Glue code must exist in the same executor project), then call execute() method and execute task logic.
-##### 5.5.5 task log
+#### 5.5.5 task log
XXL-JOB will generate a log file for every schedule request, the log info will be recorded by XxlJobLogger.log() method, the log file will be loaded when view log info through schedule center.
(history version is implemented by overriding LOG4J’s Appender so it exists dependency restrictions, The way has been discraded in the new version)
@@ -698,17 +701,17 @@ The location of log file can be specified in executor configuration file, defaul
When start child thread in JobHandler, child thread will print log in parent JobHandler thread’s execute log in order to trace execute log.
-#### 5.6 Communication module analysis
+### 5.6 Communication module analysis
-##### 5.6.1 A complete task schedule communication process
+#### 5.6.1 A complete task schedule communication process
- 1,schedule center send http request to executor, and the service in executor in fact is a jetty server with default port 9999.
- 2,executor execute task logic.
- 3,executor http callback with schedule center for schedule result, the service in schedule center used to receive callback request from executor is a set of api opended to executor.
-##### 5.6.2 Encrypt Communication data
+#### 5.6.2 Encrypt Communication data
When scheduler center send request to executor, it will use RequestModel and ResponseModel object to encapsulate schedule request parameters and response data, these two object will be serialized before communication, data protocol and time stamp will be checked so that achieve data encryption target.
-#### 5.7 task register and task auto discover
+### 5.7 task register and task auto discover
Task executor machine property has been canceled from v1.5, instead of task register and auto discovery, get remote machine address dynamic.
AppName: unique identify of executor cluster, executor is minimal unite of task register, every task recognize machine addresses under the executor on which it was binded.
@@ -717,10 +720,10 @@ Task executor machine property has been canceled from v1.5, instead of task regi
To ensure system lightweight and reduce learning costs, it did not use Zookeeper as register center, Use DB as register center to do task registration.
-#### 5.8 task execute result
+### 5.8 task execute result
Since v1.6.2, the task execute result is recognized through ReturnT of IJobHandler, it executes success when return value meets the condition "ReturnT.code == ReturnT.SUCCESS_CODE" , or it executes fail, and it can callback error message info to schedule center through ReturnT.msg, so it can control task execute results in the task logic.
-#### 5.9 slice broadcat & dynamic slice
+### 5.9 slice broadcat & dynamic slice
When “分片广播” is selected as route policy in executor cluster, one task schedule will broadcast all executor node in cluster to trigger task execute in every executor, pass slice parameter at the same time, so we can develop slice task by slice parameters.
"分片广播" break the task by the dimensions of executor, support dynamic extend executor cluster so that it can add slice number dynamically to do business process, In case of large amount of data process can significantly improve task processing capacity and speed.
@@ -738,7 +741,7 @@ This feature applies to scenes as shown below:
- 1、slice task scene:when 10 executor to handle 10w records, 1w records need to be handled per machine, time-consuming 10 times lower;
- 2、Broadcast task scene:broadcast all cluster nodes to execute shell script、broadcast all cluster nodes to update cache.
-#### 5.10 AccessToken
+### 5.10 AccessToken
To improve system security it is need to check security between schedule center and executor, just allow communication between them when AccessToken of each other matched.
The AccessToken of scheduler center and executor can be configured by xxl.job.accessToken.
@@ -750,7 +753,7 @@ There are only two settings when communication between scheduler center and exec
## 6 Version update log
-#### 6.1 version V1.1.x,New features [2015-12-05]
+### 6.1 version V1.1.x,New features [2015-12-05]
**【since V1.1.x,XXL-JOB was used by company hiring me,alias Ferrari inner company,the latest version is recommended for new project】**
- 1、simple:support CRUD operation through Web page, simple and one minute to get started;
- 2、dynamic:support dynamic update task status,pause/recover task and effective in real time;
@@ -761,7 +764,7 @@ There are only two settings when communication between scheduler center and exec
- 7、support for custom parameters;
- 8、Support pause task execution remotely .
-#### 6.2 version V1.2.x,New features [2016-01-17]
+### 6.2 version V1.2.x,New features [2016-01-17]
- 1、support task group;
- 2、suport local task, remote task;
- 3、support two types underlying communication ,Servlet or JETTY;
@@ -779,7 +782,7 @@ There are only two settings when communication between scheduler center and exec
- High scalability;
- stability;
-#### 6.3 version V1.3.0,New features [2016-05-19]
+### 6.3 version V1.3.0,New features [2016-05-19]
- 1、discard local task module, remote task was recommended, easy to decouple system, the JobHander of task was called executor.
- 2、dicard underlying communication type servlet, JETTY was recommended, schedule and callback bidirectional communication, rebuild the communication logic;
- 3、UI interactive optimization:optimize left menu expansion and menu item selected status , task list opens the table with compression optimization;
@@ -789,7 +792,7 @@ There are only two settings when communication between scheduler center and exec
- BEAN mode executor:every executor is a Spring Bean instance,it was recognized and scheduled by XXL-JOB through @JobHander annotation;
-GLUE mode executor:every executor corresponds to a piece of code,edited and maintained online by Web, Dynamic compile and takes effect in real time, executor is responsible for loading GLUE code and executing;
-#### 6.4 version V1.3.1,New features [2016-05-23]
+### 6.4 version V1.3.1,New features [2016-05-23]
- 1、Update project directory structure:
- /xxl-job-admin -------------------- 【schedule center】:Responsible for managing schedule information,send schedule request according to schedule configuration;
- /xxl-job-core ----------------------- Public core dependence
@@ -799,12 +802,12 @@ There are only two settings when communication between scheduler center and exec
- 2、Upgrade the user manual under the new directory structure;
- 3、Optimize some interactions and UI;
-#### 6.5 version V1.3.2,New features [2016-05-28]
+### 6.5 version V1.3.2,New features [2016-05-28]
- 1、Schedule logic for transactional handle;
- 2、executor asynchronous callback execution log;
- 3、【important】based on HA support of schedule center,extend executor’s Failover support,Support configure multiple execution addresses;
-#### 6.6 version V1.4.0 New features [2016-07-24]
+### 6.6 version V1.4.0 New features [2016-07-24]
- 1、Task dependency: it is implemented by trigger event, it will automatically trigger a child task schedule after Task execute success and callback, multiple child tasks are separated by commas;
- 2、executor source code has been reconstructed, optimize underlying db script;
- 3、optimize task thread group logic of executor, before it is group by executor’s JobHandler so when multiple task reuse Jobhanlder will cause block with each other. Now it is grouped by task of schedule center so tasks are isolated from task execution.
@@ -823,7 +826,7 @@ There are only two settings when communication between scheduler center and exec
Tips: V1.3.x release has been published , enter the maintenance phase, branch address is [V1.3](https://github.com/xuxueli/xxl-job/tree/v1.3) .New features will be updated continuously in the master branch.
-#### 6.7 version V1.4.1 New features [2016-09-06]
+### 6.7 version V1.4.1 New features [2016-09-06]
- 1、project successfully pushed to maven central warehouse, Central warehouse address and dependency as shown below:
```
@@ -841,14 +844,14 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 7、optimize table structure and the table name now is upper case;
- 8、modify ContentType of JSON response from exception handler of schedule center to fix the bug that it is could not recognized by browser.
-#### 6.8 version V1.4.2 New features [2016-09-29]
+### 6.8 version V1.4.2 New features [2016-09-29]
- 1、push V1.4.2 to maven central warehouse, main version V1.4 enter maintenance phase;
- 2、fix problem task list offset when add task;
- 3、fix a style disorder problem that caused by bootstrap does not support the modal frame overlap , the problem occurs when the task is edited;
- 4、optimize schedule status when schedule timeout and Handler could not matched;
- 5、the task could not stop problem caused by catch exception has given solution;
-#### 6.9 version V1.5.0 New features [2016-11-13]
+### 6.9 version V1.5.0 New features [2016-11-13]
- 1、task register: executor registers the task automatically, schedule center will automatically discover the registered task and trigger execution.
- 2、add parameter AppName for executor: AppName is the unique identifier of each executor cluster, register periodically and automatically with AppName.
- 3、add column executor management in schedule center : manage online executors, automatically discover registered executors via the property AppName。Only managed executors are allowed to be used;
@@ -858,14 +861,14 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 7、adjust table structure, reconstruct the project;
- 8、schedule center automatically registered and found, failover: schedule center periodically registered automatically, task callback can recognize all online schedule center addresses, task callback support failover so that it can avoid single point of risk.
-#### 6.10 version V1.5.1 New features [2016-11-13]
+### 6.10 version V1.5.1 New features [2016-11-13]
- 1、Reconstruct the underlying code and optimize logic, clean POM and Clean Code;
- 2、Servlet/JSP Spec selected 3.0/2.2;
- 3、Spring updated to 3.2.17.RELEASE version;
- 4、Jetty updated to version 8.2.0.v20160908;
- 5、has push V1.5.0 and V1.5.1 to maven central warehouse;
-#### 6.10 version V1.5.2 New features [2017-02-28]
+### 6.10 version V1.5.2 New features [2017-02-28]
- 1、optimize IP tools class which used to gets IP address,IP static cache;
- 2、both executor and schedule center support customize registered IP address;Solve problem when machine has multiple network card and get the wrong card;
- 3、solve the problem that it will generate multiple log files when executed across days;
@@ -875,7 +878,7 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 7、reconstruct underlying code and optimize logic and Clean Code;
- 8、optimize Dependency Injection Logic of GLUE, support injected as alias;
-#### 6.11 version V1.6.0 New features [2017-03-13]
+### 6.11 version V1.6.0 New features [2017-03-13]
- 1、upgrade communication scheme,the HEX communication model is adjusted to the B-RPC model based on HTTP;
- 2、executor supports set execution address list manually,provide switch to use automatically registered address or manually set address;
- 3、executor route rules:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移;
@@ -886,20 +889,20 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 8、new created task defaults to a non-running state;
- 9、optimize update logic of GLUE mode task instance , The original update is based on the timeout value and now is updated according to the version number,version number plus one while source changed;
-#### 6.12 version V1.6.1 New features [2017-03-25]
+### 6.12 version V1.6.1 New features [2017-03-25]
- 1、Rolling log;
- 2、reconstruct WebIDE interactive;
- 3、enhanced communication check,filter unnormal requests effectively;
- 4、enhanced permission check,Using dynamic login TOKEN(recommend instead of internal SSO);
- 5、optimize database configuration,solve garbled problem;
-#### 6.13 version V1.6.2 New features [2017-04-25]
+### 6.13 version V1.6.2 New features [2017-04-25]
- 1、execution report:support view run time data in real time, such as task number, total schedule number, executor number etc., include schedule report , such as scheduled distribution graph on date, scheduled success distribution graph etc;
- 2、JobHandler support set return value for tasks, it is easy to control task execute result in task logic;
- 3、the problem could not view exception info when resource path include space or chinese word casused resource file could not be loaded;
- 4、optimize route policy:fix problems that Loop and LFU routing policy counters are no limit and first route is focused on the first machine;
-#### 6.14 version V1.7.0 New features [2017-05-02]
+### 6.14 version V1.7.0 New features [2017-05-02]
- 1、script task:support develop and run script task by GLUE, include script type such as Shell、Python and Groovy;
- 2、add spring-boot type executor example project;
- 3、upgrade jetty to version 9.2;
@@ -907,7 +910,7 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 5、executor remove GlueLoader dependency,instead of push mode,thus GLUE source code load no longer rely on JDBC;
- 6、get the project name when login and redirect, solve 404 problem when it is not deployed by the directory;
-#### 6.15 version V1.7.1 New features [2017-05-08]
+### 6.15 version V1.7.1 New features [2017-05-08]
- 1、unified write and read code of execute log as UTF-8,solve log garbled problem under windows environment;
- 2、communication timeout period is limited to 10s,To avoid schedule thread is occupied under abnormal situation;
- 3、adjust executor , server stat, destroy and register logic;
@@ -917,7 +920,7 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 7、pop-up component is replaced by layer;
- 8、upgrade quartz to version 2.3.0;
-#### 6.16 version V1.7.2 New features [2017-05-17]
+### 6.16 version V1.7.2 New features [2017-05-17]
- 1、block handle policy:the policy when schedule is too frequently and the executor it too late to handle, include multiple strategies:single machine serially execute(default)、discard subsequent schedule、override before schedule;
- 2、fail handle policy:handle policy when scheduled fail, include :failure alarm(default)、failed to retry;
- 3、The communication timeout is adjusted to 180s;
@@ -925,7 +928,7 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 5、fix executor parameters lost bug when edit;
- 6、add task test Demo to make task logic test easier;
-#### 6.17 version V1.8.0 New features [2017-07-17]
+### 6.17 version V1.8.0 New features [2017-07-17]
- 1、optimize update logic of task Cron,instead of rescheduleJob,at the same time preventing set cron repeatedly;
- 2、optimize API callback service failed status code,facilitate troubleshooting;
- 3、XxlJobLogger support multi-parameter;
@@ -938,7 +941,7 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 10、supports filter execute log based on running status;
- 11、optimize scheduling Center Task Registration Detection Logic;
-#### 6.18 version V1.8.1 New features [2017-07-30]
+### 6.18 version V1.8.1 New features [2017-07-30]
- 1、slice broadcast task:When slice broadcast is selected as route policy in executor cluster, one task schedule will broadcast all executor node in cluster to trigger task execute in every executor, pass slice parameter at the same time, so we can develop slice task by slice parameters;
- 2、dynamic slice: break the task by the dimensions of executor, support dynamic extend executor cluster so that it can add slice number dynamically to do business process, In case of large amount of data process can significantly improve task processing capacity and speed;
- 3、executor JobHandler disables name conflicts;
@@ -951,12 +954,12 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
- 10、upgrade springboot version to 1.5.6.RELEASE of executor;
- 11、unify maven version dependency management;
-#### 6.19 version V1.8.2 New features[Coding]
+### 6.19 version V1.8.2 New features[Coding]
- 1,support configuring the HTTPS for executor callback URL;
- 2,Standardize project directory for extend multi executors;
- 3,add JFinal type executor sample project;
-#### TODO LIST
+### TODO LIST
- 1,Task privilege management:control privilege on executor, check privilege on core operations;
- 2,Task slice routing:using consistent Hash algorithm to calculate slice order as stable as possible, even if there is fluctuation in the registration machine will not cause large fluctuations in the order of slice. Currently using IP natural sorting can meet the demand,to be determined;
- 3,Failure retry optimization:The current failure to retry logic is execute the request logic once again after the scheduled request fails。The optimization point is retry for both scheduling and execution failures, retry a full schedule when retrying,This may lead schedule failure to an infinite loop,to be determined;
@@ -970,22 +973,22 @@ Tips: V1.3.x release has been published , enter the maintenance phase, branch a
## 7. Other
-#### 7.1 report problem
-XXL-JOB project is on Github,If you have any questions, you can ask questions at [ISSUES](https://github.com/xuxueli/xxl-job/issues/) You can also join the above technical exchange group;
+### 7.1 Contributing
+Contributions are welcome! Open a pull request to fix a bug, or open an [Issue](https://github.com/xuxueli/xxl-job/issues/) to discuss a new feature or change.
-#### 7.2 used records(record just for spread,Product is open source and free of charge)
+### 7.2 used records(record just for spread,Product is open source and free of charge)
Record for spread product and product is free and open source.
Welcome to [check in](https://github.com/xuxueli/xxl-job/issues/1 )on github.
-#### 7.3 Open source protocol and version
-Product is open source and free of charge,will provide free community technical support continuously,Personal or company internal free access and use.
+### 7.3 Copyright and License
+This product is open source and free, and will continue to provide free community technical support. Individual or enterprise users are free to access and use.
-XXL-JOB uses GPLv3 protocol to ensure the user's right of free use. The agreement avoids special risk of patent applications "the GPL assures that patents cannot be used to render the program non-free.(From GPLv3)".
-Copyright (c) 2015-present, xuxueli.
+- Licensed under the GNU General Public License (GPL) v3.
+- Copyright (c) 2015-present, xuxueli.
---
-#### donation
-scan it if want to support project,reward a cup of coffee to author:)
+### Donate
+To support the author, donate the author to buy a cup of coffee:)
webchat:![输入图片说明](https://static.oschina.net/uploads/img/201707/07214300_qhxT.png "在这里输入图片标题")
Alipay:![输入图片说明](http://images2015.cnblogs.com/blog/554415/201605/554415-20160513183306234-1939652116.png "在这里输入图片标题")
diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md
index 8e42db54..07354560 100644
--- a/doc/XXL-JOB官方文档.md
+++ b/doc/XXL-JOB官方文档.md
@@ -1,4 +1,4 @@
-# 《分布式任务调度平台XXL-JOB》
+## 《分布式任务调度平台XXL-JOB》
[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/badge.svg)](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是一个轻量级分布式任务调度框架,其核心设计目标是
```
-#### 博客地址
-
-- [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 配置执行器
点击进入"执行器管理"界面, 如下图:
![输入图片说明](https://static.oschina.net/uploads/img/201703/12223509_Hr2T.png "在这里输入图片标题")
@@ -421,7 +425,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
点击按钮 "+新增执行器" 弹框如下图, 可新增执行器配置:
![输入图片说明](https://static.oschina.net/uploads/img/201703/12223617_g3Im.png "在这里输入图片标题")
-#### 执行器属性说明
+### 执行器属性说明
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 终止运行中的任务”
![输入图片说明](https://static.oschina.net/uploads/img/201607/24130337_ZAhX.png "在这里输入图片标题")
-#### 4.5 手动触发一次调度
+### 4.5 手动触发一次调度
点击“执行”按钮,可手动触发一次任务调度,不影响原有调度规则。
![输入图片说明](https://static.oschina.net/uploads/img/201607/24133348_Z5wp.png "在这里输入图片标题")
-#### 4.6 查看调度日志
+### 4.6 查看调度日志
点击“日志”按钮,可以查看任务历史调度日志。在历史调入日志界面可查看每次任务调度的调度结果、执行结果等,点击“执行日志”按钮可查看执行器完整日志。
![输入图片说明](https://static.oschina.net/uploads/img/201607/24133500_9235.png "在这里输入图片标题")
@@ -474,12 +478,12 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
"执行日志"按钮:点击可查看本地任务执行的详细日志信息;详见“4.7 查看执行日志”;
"终止任务"按钮:点击可终止本地调度对应执行器上本任务的执行线程,包括未执行的阻塞任务一并被终止;
-#### 4.7 查看执行日志
+### 4.7 查看执行日志
点击执行日志右侧的 “执行日志” 按钮,可跳转至执行日志界面,可以查看业务代码中打印的完整日志,如下图;
![输入图片说明](https://static.oschina.net/uploads/img/201703/25124816_tvGI.png "在这里输入图片标题")
-#### 4.8 终止运行中的任务
+### 4.8 终止运行中的任务
仅针对执行中的任务。
在任务日志界面,点击右侧的“终止任务”按钮,将会向本次任务对应的执行器发送任务终止请求,将会终止掉本次任务,同时会清空掉整个任务执行队列。
@@ -502,26 +506,27 @@ try{
而且,在JobHandler中开启子线程时,子线程也不可catch处理"InterruptedException",应该主动向上抛出。
-#### 4.9 删除执行日志
+### 4.9 删除执行日志
在任务日志界面,选中执行器和任务之后,点击右侧的"删除"按钮将会出现"日志清理"弹框,弹框中支持选择不同类型的日志清理策略,选中后点击"确定"按钮即可进行日志清理操作;
![输入图片说明](https://static.oschina.net/uploads/img/201705/08210711_Ypik.png "在这里输入图片标题")
![输入图片说明](https://static.oschina.net/uploads/img/201705/08211152_EB65.png "在这里输入图片标题")
-#### 4.10 删除任务
+### 4.10 删除任务
点击删除按钮,可以删除对应任务。
![输入图片说明](https://static.oschina.net/uploads/img/201607/24140641_Z9Qr.png "在这里输入图片标题")
+
## 五、总体设计
-#### 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 架构图
![输入图片说明](https://static.oschina.net/uploads/img/201707/17190028_aEE2.png "在这里输入图片标题")
-#### 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
![输入图片说明](https://static.oschina.net/uploads/img/201607/24194212_jOAU.png "在这里输入图片标题")
-#### 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)。
![输入图片说明](https://static.oschina.net/uploads/img/201703/10174923_TgNO.png "在这里输入图片标题")
@@ -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中央仓库, 中央仓库地址以及依赖如下:
```
@@ -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.
---
-#### 捐赠
+### 捐赠
支持的话可以扫一扫,请作者喝杯咖啡吧:)
微信:![输入图片说明](https://static.oschina.net/uploads/img/201707/07214300_qhxT.png "在这里输入图片标题")
diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl
index 20db085c..9f3ca364 100644
--- a/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl
+++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl
@@ -36,7 +36,7 @@
github
- oschina(文档中有交流群)
+ 文档地址