Bläddra i källkod

任务串行改位并行执行

xueli.xue 9 år sedan
förälder
incheckning
b841861577

+ 205 - 80
doc/XXL-JOB1.3.x用户手册_20160522_1547.docx

@@ -2,61 +2,67 @@ XXL-JOB 1.3 用户手册
 
 一 简介	2
 1.1 背景	2
-1.2 发展	2
-1.3 概述	2
-1.4 特点	2
-1.5 下载	3
-1.6 环境	3
+1.2 特点	2
+1.3 发展	2
+1.4 下载	3
+1.5 环境	3
 二 快速入门	4
 2.1 初始化"调度数据库"	4
 2.2 编译源码	5
 2.3 配置部署"调度中心"	5
-2.4 配置部署"执行器"	7
-2.5 开发第一个任务"Hello World"	8
-三 系统详解	12
-3.1 源码目录介绍	12
-3.1 "调度数据库"详解	12
-3.2 "调度中心"详解	12
-3.3 "执行器"详解	12
-四 任务详解	13
-4.1 BEAN模式任务	13
-4.2 GLUE模式任务	13
-五 任务管理	14
-5.1 编辑任务信息	14
-5.2 编辑GLUE代码	14
-5.3 恢复/暂停	14
-5.4 手动触发一次调度	14
-5.5 查看日志	14
-5.6 删除任务	14
-六 设计原理	15
-6.1 总体架构	15
-6.2 调度原理	15
-6.3 通讯原理	15
-6.4 执行器原理	15
-七 其他	16
-7.1 接入登记	16
-7.2 报告问题	16
+2.4 配置部署"执行器项目"	7
+2.5 开发第一个任务"Hello World"	9
+三 任务详解	12
+4.1 BEAN模式任务	12
+4.3 GLUE模式任务	13
+四 任务管理	15
+5.1 编辑任务信息	15
+5.2 编辑GLUE代码	15
+5.3 恢复/暂停	16
+5.4 手动触发一次调度	16
+5.5 查看日志	16
+5.6 删除任务	17
+5.7 终止运行中的任务	17
+五 总体设计	19
+5.1 源码目录介绍	19
+5.2 "调度数据库"配置	19
+5.2 架构设计	21
+6.3 调度模块	22
+6.4 任务模块	24
+6.5 通讯模块	24
+七 其他	25
+7.1 接入登记	25
+7.2 报告问题	25
 
 
 一 简介
   1.1 背景
-  作业调度系统我使用过相当一部分,比如Java Timer、linux corntab和quartz,但是都遇到一些共同的问题,开发成本高,维护复杂等等。在我进入大众点评之后,我试用过内部调度系统,功能完善,但是开发和部署流程略复杂。
-  我钟爱KISS原则,因此我萌发了打造XXL-JOB的想法,期望是能够创造一种全新的调度体验。
-  1.2 发展
+  Quartz作为开源作业调度中的佼佼者,是作业调度的首选。
+  非集群Quartz开发需要配置Trigger,JobBean,配置Corn等等,虽然简单,但是流程较多;集群Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:
+  问题一:调用API的的方式操作任务,不人性化;
+  问题二:需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。	问题三:调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务;
+   为了解决上述问题,期望是能够创造一种全新的调度体验。新系统目标是:更易维护、更高的可用性和更好的伸缩性。这要求"调度"和"作业"进行解耦,同时支持友好的可视化管理。由此,我萌发了打造XXL-JOB的想法,
+  1.2 特点
+  1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
+  2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效;
+  3、服务HA:任务信息持久化到mysql中,Job服务天然支持集群,保证服务HA;
+  4、任务HA:某台Job服务挂掉,任务会平滑分配给其他的某一台存活服务,即使所有服务挂掉,重启时或补偿执行丢失任务;
+  5、一个任务只会在其中一台服务器上执行;
+  6、任务串行执行;
+  7、支持任务执行日志;
+  8、支持自定义参数;
+  9、支持任务失败次数超阈值邮件报警;
+  10、支持在线查看,执行器详细日志;
+  11、支持远程任务执行终止;
+  12、支持登录验证;
+  1.3 发展
   我于2015-11-28在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计......
-  于2016-12-05日XXL-JOB终于release了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的推荐,同期分别达到了OSCHINA的"热门动弹"排行第一和git.oschina的月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。
-  于2015-12月中旬我将XXL-JOB发表到我司内部知识库,得到内部同事认可。于2016-01月我司展开XXL-JOB的内部接入和定制工作。
+  于2015-12-05日XXL-JOB终于release了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的推荐,同期分别达到了OSCHINA的"热门动弹"排行第一和git.oschina的月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。
+  于2015-12月中旬我将XXL-JOB发表到我司内部知识库,得到内部同事认可。于2016-01月我司展开XXL-JOB的内部接入和定制工作,在此感谢袁某和尹某两位同事的贡献,同时也感谢内部其他给与关注与支持的同事
   我司大众点评已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本V1.3)。自2016-01-21接入至2016-05-20为止,该系统已调度40000余次,表现优异。
   至今,XXL-JOB已接入多家公司的线上产品线,场景如电商业务,O2O业务和大数据作业等等,欢迎大家使用,XXL-JOB也将拥抱变化,持续发展。
-  1.3 概述
-  XXL-JOB是一款简单高效的分布式任务调度平台,支持可视化且实时动态的管理Trigger和Job。
-  1.4 特点
-  简单:支持通过Web在线开发Job并配置,流程简洁;
-  高效:任务动态部署和配置,节省打包和部署消耗,提高开发效率;
-  分布式:得益于Quartz的集群支持,XXL-JOB调度中心天生支持HA,避免单点故障;
-  实时Trigger:支持可视化的管理Trigger,动态管理Triggrer;
-  实时Job:支持可视化的管理Job,动态管理Job,V1.3支持在线开发业务代码;
-  1.5 下载
+
+  1.4 下载
   Github地址:https://github.com/xuxueli/xxl-job
   Git@OSC地址:http://git.oschina.net/xuxueli0323/xxl-job
   (我将会在两个git仓库同步发布最新代码)
@@ -64,7 +70,7 @@ XXL-JOB 1.3 用户手册
   
   (图1.3:github下载链接位置)
   源码下载请前往github自行下载,下载位置见上图1.3;
-  1.6 环境
+  1.5 环境
   Maven3
   JDK1.7
   Tomcat7
@@ -186,54 +192,126 @@ XXL-JOB 1.3 用户手册
     (图2.5H:"调度中心"管理管理界面,任务日志入口)
                                        
  三 任务详解
-  4.1 任务参数介绍
-  
-  
-                    (图4.1A:新增任务表单接口)
+  4.1 BEAN模式任务
+  Bean模式任务:任务逻辑以JobHandler的形式存在于"执行器"所在项目中,开发流程如下:
+  A:开发JobHandler
+  如图4.1A所示,一个Bean模式的JobHandler需要配置以下三项:
+   继承IJobHandler;
+   被Spring容器扫描为Bean示例;
+   添加@JobHander(name="demoJobHandler")注解,并定制handler名称,该名称是新建任务是JobHandler属性的值;
+  (例如xxl-job-client-demo项目中的DemoJobHandler)
   
-参数名
-功能
+                                        
+                (图4.1A:Bean模式任务的示例Handler)
+                                        
+                                        
+  B:新建调度任务,并配置,参数如下
 任务组
-用于分组管理任务
+任意选择
 任务名
-任务组内,任务的唯一标示
+自定义,保证唯一即可
 Corn
-触发执行执行的Corn表达式
+根据业务情况配置
 描述
-描述信息
+任意
 执行器地址
-任务所在的执行器的地址,格式为"IP:Port"。其中IP为执行器机器IP,Port为"执行器Server"端口,如图2.4B所示。
+执行器的地址,格式"IP:Port",IP为"执行器"项目所在的机器的IP地址,因为本机部署所以为"127.0.0.1",Port为"执行器"端口,如图2.4B所示,"xxl-job-client-demo"项目里的"执行器"配置的默认端口为9999,因为执行器地址为:127.0.0.1:9999
+
 JobHandler
-非GLUE模式任务是才需要配置,该模式下任务代码是一个继承IJobHandler的Java类对象,需要提供JobHandlee的名称,执行器才可以匹配任务Handler并执行。
+Bean模式,任务代码在以JobHandler的形式部署在"执行器"所在的项目里。
+此时应该填写对应任务JobHandler上注解@JobHander的name属性值,如图4.1A所示,示例任务name属性为demoJobHandler,因此此处填写demoJobHandler
 执行参数
-JOBHandler的入参
+任务执行的参数,多个入参都好分割,调用任务handler时会拆分成数组传入
 负责人
 任务负责人
 报警邮件
-任务失败报警邮件发送地址
+任务失败时邮件通知的邮箱
 报警阀值
-失败超过该值才会发送邮件
+任务失败次数超过该值才会发送报警邮件
 开启GLUE模式
-如开启GLUE模式,"执行器Server"会读取GLUE代码并执行,否则,"执行器Server"将会匹配项目中的JobHander并执行;
-  
-  
-  4.2 BEAN模式任务
-  Bean模式任务:任务逻辑以JobHandler的形式存在于"执行器"所在项目中,有以下特点;
+选择关闭状态
+    
   
+                 (图4.1B:Bean模式任务的示例配置)
   4.3 GLUE模式任务
+  A:新建调度任务,并配置,参数如下
+任务组
+同Bean模式
+任务名
+同Bean模式
+Corn
+同Bean模式
+描述
+同Bean模式
+执行器地址
+同Bean模式
+
+JobHandler
+GLUE 模式,业务代码保存在数据库中,并不需要"执行器"根据JobHandler去匹配任务Handler,因此此时该属性disable;
+执行参数
+同Bean模式
+负责人
+同Bean模式
+报警邮件
+同Bean模式
+报警阀值
+同Bean模式
+开启GLUE模式
+选择开启状态;
+
+                                       
+                 (图4.2A:Glue模式任务的示例配置)
+
  
  四 任务管理
   5.1 编辑任务信息
+  在调度管理界面,如图5.1A所示,点击"编辑"按钮,弹出更新任务界面,界面如图5.1B所示。修改属性值,保存后实时生效。
+
+            (图5.1A:调度管理列表,"编辑"按钮)
+
+            (图5.1B:调度管理列表,更新任务界面)
+                                       
   5.2 编辑GLUE代码
+  表操作仅针对GLUE任务,如图5.2A所示在调度管理界面点击"GLUE"按钮,进入GLUE开发界面,界面如图5.2B所示;在GLUE编辑器中可对GLUE代码进行开发;(当然也可以在IDE中开发完成后,复制粘贴到编辑中)
+  版本回溯功能:如图5.2B,选择下拉框"版本回溯",会列出该GLUE的更新历史,选择相应版本即可显示该版本代码,保存后GLUE代码即回退到对应的历史版本;
+  
+                       (图5.2A:GLUE入口按钮)
+  
+  
+                       (图5.2B:GLUE开发界面)
   5.3 恢复/暂停
+  可对调度任务进行暂停和回复操作;
+
+                      (图5.3:暂停/回复按钮)
+
   5.4 手动触发一次调度
+  点击"执行"按钮,可手动触发一次任务调度,不影响原有调度规则。
+  
+                          (图5.3:执行按钮)
   5.5 查看日志
+  如图5.5A所示,点击"日志"按钮,可以查看任务历史调度日志。在历史调入日志界面(见图5.5B)可查看每次任务调度的调度结果、执行结果等,点击执行日志按钮可查看执行器完整日志(如图5.5C);
+  
+                       (图5.5A:任务日志入口)
+
+                                       
+                          (图5.5B:执行日志)
+                                        
+                                       
+                      (图5.5C:完整的执行日志)
   5.6 删除任务
+  点击删除按钮,可以删除对应任务。
+  
+  
+  5.7 终止运行中的任务
+  
+  进入调度日志界面,如图5.7所示可查看目前正在运行的任务,如果任务正在运行中,右侧将会显示"终止任务"按钮,点击按钮将会终止任务执行。
+                      	(图5.7:完整的执行日志)
+  
  
- 三 系统详解
-  3.1 源码目录介绍
+ 五 总体设计
+  5.1 源码目录介绍
                                        
-                       (图3.1:源码目录截图)
+                       (图5.1:源码目录截图)
 
 目录
 介绍
@@ -249,16 +327,16 @@ JOBHandler的入参
 "执行器"示例Wed项目源码。
   
   其中,Wed项目"xxl-job-client-demo"是Demo执行器项目,大家可以在该项目上进行开发,也可以将现有项目改造生成执行器项目;
-  3.2 "调度数据库"配置
+  5.2 "调度数据库"配置
   XXL-JOB调度模块基于Quartz集群实现,其"调度数据库"是在Quartz的11张集群mysql表基础上扩展而成。
   XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_),如图3.2A所示。
   然后,在此基础上新增了三张扩展表,如下:
   xxl_job_qrtz_trigger_info:
   xxl_job_qrtz_trigger_log:
   xxl_job_qrtz_trigger_logglue:
-  因此,XXL-JOB调度数据库共计用于14张数据库表,详细介绍如图3.2B所示。
+  因此,XXL-JOB调度数据库共计用于14张数据库表,详细介绍如图5.2B所示。
   
-         (图3.2A:XXL-JOB数据库,公共前缀配置,截图)
+         (图5.2A:XXL-JOB数据库,公共前缀配置,截图)
   表介绍:XXL-JOB拥有14张表,
   
                                        
@@ -294,16 +372,63 @@ xxl_job_qrtz_trigger_logglue
 任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
 xxl_job_qrtz_triggers
 Quartz表
-                                       
-  3.2 "调度中心"详解
+
+  5.2 架构设计
+  系统主要由以下三个基础模块组成:
+  调度模块(调度中心xxl-job-admin):负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
+  支持可视化、简单且动态的维管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志。
+  任务模块(执行器xxl-job-client-demo):负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行,开发和维护更加简单和高效;
+  负责接收"调度中心"的调度请求(运行/终止/日志)。
+  通讯模块:负责调度模块和任务模块之间的信息通讯;
   
-  3.3 "执行器"详解
- 
- 六 设计原理
-  6.1 总体架构
-  6.2 调度原理
-  6.3 通讯原理
-  6.4 执行器原理
+
+  
+  
+  6.3 调度模块
+  A:RemoteHttpJobBean:常规Quartz的开发,任务逻辑一般维护在QuartzJobBean中,耦合很严重。XXL-JOB中"调度模块"和"任务模块"完全解耦,调度模块中的所有调度任务使用同一个QuartzJobBean,即RemoteHttpJobBean。不同的调度任务将各自参数维护在各自扩展表数据中,当触发RemoteHttpJobBean执行时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务。
+  这种调用模型类似RPC调用,RemoteHttpJobBean提供调用代理的功能,而执行器提供远程服务的功能。
+  
+  B:集群分布式:基于Quartz的集群方案,数据库选用Mysql;集群分布式并发环境中使用QUARTZ定时任务调度,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
+  
+  
+  
+  C:调度线程池:默认线程池中线程的数量为10个,避免单线程因阻塞而引起任务调度延迟。
+  
+  
+  D:@DisallowConcurrentExecution:XXL-JOB调度模块的"调度中心"默认不使用该注解,即默认开启并行机制,因为RemoteHttpJobBean为公共QuartzJobBean,这样在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。
+  XXL-JOB的每个调度任务虽然在调度模块是并行调度执行的,但是任务调度传递到任务模块的"执行器"确实串行执行的,同时支持任务终止。
+  
+  
+  
+  
+
+  E:misfire:错过了触发时间,处理规则
+  可能原因:服务重启;调度线程被QuartzJobBean阻塞,线程被耗尽;某个任务启用了@DisallowConcurrentExecution,上次调度持续阻塞,下次调度被错过;
+  
+  Quartz.properties中关于misfire的阀值配置,单位毫秒:
+    
+  
+  
+  Misfire规则:
+    withMisfireHandlingInstructionDoNothing:不触发立即执行,等待下次调度;
+    withMisfireHandlingInstructionIgnoreMisfires:以错过的第一个频率时间立刻开始执行;
+    withMisfireHandlingInstructionFireAndProceed:以当前时间为触发频率立刻触发一次执行;
+  
+  XXL-JOB默认misfire规则为:withMisfireHandlingInstructionDoNothing
+  
+  
+  
+  
+  
+  F:日志回调服务:
+  调度模块的"调度中心"作为Web服务单独部署,除此之外,内部嵌入jetty服务器提供日志回调服务。
+  "执行器"在接收到任务执行请求后,执行任务,在执行结束之后会将执行结果回调通知"调度中心",如下图所示。
+  
+  6.4 任务模块
+  任务开发:请参考章节三;
+  执行器详解:
+  任务日志:
+  6.5 通讯模块
  
  七 其他
   7.1 接入登记

+ 0 - 1
doc/~$L-JOB1.3.x用户手册_20160522_1547.docx

@@ -1 +0,0 @@
-
Administrator
Administrator

+ 1 - 2
xxl-job-admin/src/main/java/com/xxl/job/service/job/RemoteHttpJobBean.java

@@ -4,7 +4,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.quartz.DisallowConcurrentExecution;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.quartz.JobKey;
@@ -27,7 +26,7 @@ import com.xxl.job.core.util.DynamicSchedulerUtil;
  * “@DisallowConcurrentExecution” diable concurrent, thread size can not be only one, better given more
  * @author xuxueli 2015-12-17 18:20:34
  */
-@DisallowConcurrentExecution
+//@DisallowConcurrentExecution
 public class RemoteHttpJobBean extends QuartzJobBean {
 	private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
 	

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl

@@ -188,7 +188,7 @@ public class DemoJobHandler extends IJobHandler {
 	<div class="modal-dialog modal-lg">
 		<div class="modal-content">
 			<div class="modal-header">
-            	<h4 class="modal-title" >新任务调度信息</h4>
+            	<h4 class="modal-title" >新任务调度信息</h4>
          	</div>
          	<div class="modal-body">
 				<form class="form-horizontal form" role="form" >