xuxueli 8 yıl önce
ebeveyn
işleme
06cf9f8a1c

+ 1 - 0
README.md Dosyayı Görüntüle

38
 - 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
38
 - 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
39
 - 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
39
 - 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
40
 - 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
40
 - 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
41
+- 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
41
 
42
 
42
 ### 架构图
43
 ### 架构图
43
 
44
 

+ 24 - 16
doc/XXL-JOB官方文档.md Dosyayı Görüntüle

34
 - 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
34
 - 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
35
 - 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
35
 - 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
36
 - 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
36
 - 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
37
+- 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
37
 
38
 
38
 ### 1.3 发展
39
 ### 1.3 发展
39
 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
40
 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
272
 
273
 
273
     - 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;
274
     - 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;
274
     - 描述:任务的描述信息,便于任务管理;
275
     - 描述:任务的描述信息,便于任务管理;
275
-    - 路由策略:当执行器集群部署时,执行器路由规则
276
+    - 路由策略:当执行器集群部署时,提供丰富的路由策略,包括
276
         FIRST(第一个):固定选择第一个执行器;
277
         FIRST(第一个):固定选择第一个执行器;
277
         LAST(最后一个):固定选择最后一个执行器;
278
         LAST(最后一个):固定选择最后一个执行器;
278
         ROUND(轮询):;
279
         ROUND(轮询):;
282
         LEAST_RECENTLY_USED(最近最久未使用):单个JOB对应的每个执行器,最久为使用的优先被选举;
283
         LEAST_RECENTLY_USED(最近最久未使用):单个JOB对应的每个执行器,最久为使用的优先被选举;
283
         FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
284
         FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
284
         BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
285
         BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
286
+        SHARDING_BROADCAST(分片广播):广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
287
+        
285
     - Cron:触发任务执行的Cron表达式;
288
     - Cron:触发任务执行的Cron表达式;
286
     - 运行模式:
289
     - 运行模式:
287
         BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 "JobHandler" 属性匹配执行器中任务;
290
         BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 "JobHandler" 属性匹配执行器中任务;
679
 
682
 
680
 为保证系统"轻量级"并且降低学习部署成本,没有采用Zookeeper作为注册中心,采用DB方式进行任务注册发现;
683
 为保证系统"轻量级"并且降低学习部署成本,没有采用Zookeeper作为注册中心,采用DB方式进行任务注册发现;
681
 
684
 
682
-#### 5.8 路由策略
683
-执行器集群部署时提供丰富的路由策略,包括:
684
-
685
-    FIRST(第一个):固定选择第一个执行器;
686
-    LAST(最后一个):固定选择最后一个执行器;
687
-    ROUND(轮询):;
688
-    RANDOM(随机):随机选择在线的执行器;
689
-    CONSISTENT_HASH(一致性HASH):分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
690
-    LEAST_FREQUENTLY_USED(最不经常使用):单个JOB对应的每个执行器,使用频率最低的优先被选举;
691
-    LEAST_RECENTLY_USED(最近最久未使用):单个JOB对应的每个执行器,最久为使用的优先被选举;
692
-    FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
693
-    BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
694
-    
695
-#### 5.9 任务执行结果
685
+#### 5.8 任务执行结果
696
 自v1.6.2之后,任务执行结果通过 "IJobHandler" 的返回值 "ReturnT" 进行判断;
686
 自v1.6.2之后,任务执行结果通过 "IJobHandler" 的返回值 "ReturnT" 进行判断;
697
 当返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 时表示任务执行成功,否则表示任务执行失败,而且可以通过 "ReturnT.msg" 回调错误信息给调度中心;
687
 当返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 时表示任务执行成功,否则表示任务执行失败,而且可以通过 "ReturnT.msg" 回调错误信息给调度中心;
698
 从而,在任务逻辑中可以方便的控制任务执行结果;
688
 从而,在任务逻辑中可以方便的控制任务执行结果;
699
 
689
 
690
+#### 5.9 "分片广播" 特性   
691
+执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
692
+
693
+"分片广播" 是以执行器集群进行分片,每个执行器属于一片,激情中多个执行器可协同分片处理大数据量任务;
694
+
695
+"分片广播" 和普通任务开发流程一致,不同之处在于可以可以获取分片参数,获取分片参数对象的代码如下(可参考example执行器中的示例任务"ShardingJobHandler" ):
696
+
697
+    ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
698
+    
699
+该分片参数对象拥有两个属性:
700
+
701
+    index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号;
702
+    total:总分片数,执行器集群的总机器数量;
703
+
704
+该特性适用场景如:
705
+- 1、分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;
706
+- 2、广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等
707
+
700
 
708
 
701
 ## 六、版本更新日志
709
 ## 六、版本更新日志
702
 #### 6.1 版本 V1.1.x,新特性[2015-12-05]
710
 #### 6.1 版本 V1.1.x,新特性[2015-12-05]
888
 - 11、调度中心任务注册检测逻辑优化;
896
 - 11、调度中心任务注册检测逻辑优化;
889
 
897
 
890
 #### 6.18 版本 V1.8.1 特性[快照版本]
898
 #### 6.18 版本 V1.8.1 特性[快照版本]
891
-- 1、任务分片:一个任务被拆分成N个独立的任务单元,然后由分布式部署的执行器分别执行某一个或几个分片单元
899
+- 1、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数处理分片任务
892
 - 2、执行器JobHandler禁止命名冲突;
900
 - 2、执行器JobHandler禁止命名冲突;
893
 
901
 
894
 #### TODO LIST
902
 #### TODO LIST

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java Dosyayı Görüntüle

16
     LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()),
16
     LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()),
17
     FAILOVER("故障转移", new ExecutorRouteFailover()),
17
     FAILOVER("故障转移", new ExecutorRouteFailover()),
18
     BUSYOVER("忙碌转移", new ExecutorRouteBusyover()),
18
     BUSYOVER("忙碌转移", new ExecutorRouteBusyover()),
19
-    BROADCAST("广播", null);
19
+    SHARDING_BROADCAST("分片广播", null);
20
 
20
 
21
     ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
21
     ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
22
         this.title = title;
22
         this.title = title;

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java Dosyayı Görüntüle

42
         ArrayList<String> addressList = (ArrayList<String>) group.getRegistryList();
42
         ArrayList<String> addressList = (ArrayList<String>) group.getRegistryList();
43
 
43
 
44
         // broadcast
44
         // broadcast
45
-        if (ExecutorRouteStrategyEnum.BROADCAST == executorRouteStrategyEnum && CollectionUtils.isNotEmpty(addressList)) {
45
+        if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum && CollectionUtils.isNotEmpty(addressList)) {
46
             for (int i = 0; i < addressList.size(); i++) {
46
             for (int i = 0; i < addressList.size(); i++) {
47
                 String address = addressList.get(i);
47
                 String address = addressList.get(i);
48
 
48
 

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl Dosyayı Görüntüle

5
   	<#import "/common/common.macro.ftl" as netCommon>
5
   	<#import "/common/common.macro.ftl" as netCommon>
6
 	<@netCommon.commonStyle />
6
 	<@netCommon.commonStyle />
7
 </head>
7
 </head>
8
-<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if> ">
8
+<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["xxljob_adminlte_settings"].value >sidebar-collapse</#if> ">
9
 <div class="wrapper">
9
 <div class="wrapper">
10
 	<!-- header -->
10
 	<!-- header -->
11
 	<@netCommon.commonHeader />
11
 	<@netCommon.commonHeader />

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl Dosyayı Görüntüle

5
   	<#import "/common/common.macro.ftl" as netCommon>
5
   	<#import "/common/common.macro.ftl" as netCommon>
6
 	<@netCommon.commonStyle />
6
 	<@netCommon.commonStyle />
7
 </head>
7
 </head>
8
-<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if> ">
8
+<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["xxljob_adminlte_settings"].value >sidebar-collapse</#if> ">
9
 <div class="wrapper">
9
 <div class="wrapper">
10
 	<!-- header -->
10
 	<!-- header -->
11
 	<@netCommon.commonHeader />
11
 	<@netCommon.commonHeader />

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl Dosyayı Görüntüle

7
 	<!-- DataTables -->
7
 	<!-- DataTables -->
8
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
8
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
9
 </head>
9
 </head>
10
-<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if> ">
10
+<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["xxljob_adminlte_settings"].value >sidebar-collapse</#if> ">
11
 <div class="wrapper">
11
 <div class="wrapper">
12
 	<!-- header -->
12
 	<!-- header -->
13
 	<@netCommon.commonHeader />
13
 	<@netCommon.commonHeader />

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl Dosyayı Görüntüle

8
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
8
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/datatables/dataTables.bootstrap.css">
9
 
9
 
10
 </head>
10
 </head>
11
-<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if>">
11
+<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["xxljob_adminlte_settings"].value >sidebar-collapse</#if>">
12
 <div class="wrapper">
12
 <div class="wrapper">
13
 	<!-- header -->
13
 	<!-- header -->
14
 	<@netCommon.commonHeader />
14
 	<@netCommon.commonHeader />

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl Dosyayı Görüntüle

9
   	<!-- daterangepicker -->
9
   	<!-- daterangepicker -->
10
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker.css">
10
   	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker.css">
11
 </head>
11
 </head>
12
-<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["adminlte_settings"].value >sidebar-collapse</#if> ">
12
+<body class="hold-transition skin-blue sidebar-mini <#if cookieMap?exists && "off" == cookieMap["xxljob_adminlte_settings"].value >sidebar-collapse</#if> ">
13
 <div class="wrapper">
13
 <div class="wrapper">
14
 	<!-- header -->
14
 	<!-- header -->
15
 	<@netCommon.commonHeader />
15
 	<@netCommon.commonHeader />

+ 7 - 7
xxl-job-admin/src/main/webapp/static/js/common.1.js Dosyayı Görüntüle

71
 
71
 
72
 	// 左侧菜单状态,js + 后端 + cookie方式(新)
72
 	// 左侧菜单状态,js + 后端 + cookie方式(新)
73
 	$('.sidebar-toggle').click(function(){
73
 	$('.sidebar-toggle').click(function(){
74
-		var adminlte_settings = $.cookie('adminlte_settings');	// 左侧菜单展开状态[adminlte_settings]:on=展开,off=折叠
75
-		if ('off' == adminlte_settings) {
76
-			adminlte_settings = 'on';
74
+		var xxljob_adminlte_settings = $.cookie('xxljob_adminlte_settings');	// 左侧菜单展开状态[xxljob_adminlte_settings]:on=展开,off=折叠
75
+		if ('off' == xxljob_adminlte_settings) {
76
+            xxljob_adminlte_settings = 'on';
77
 		} else {
77
 		} else {
78
-			adminlte_settings = 'off';
78
+            xxljob_adminlte_settings = 'off';
79
 		}
79
 		}
80
-		$.cookie('adminlte_settings', adminlte_settings, { expires: 7 });	//$.cookie('the_cookie', '', { expires: -1 });
80
+		$.cookie('xxljob_adminlte_settings', xxljob_adminlte_settings, { expires: 7 });	//$.cookie('the_cookie', '', { expires: -1 });
81
 	});
81
 	});
82
 	// 左侧菜单状态,js + cookie方式(遗弃)
82
 	// 左侧菜单状态,js + cookie方式(遗弃)
83
 	/*
83
 	/*
84
-	 var adminlte_settings = $.cookie('adminlte_settings');
85
-	 if (adminlte_settings == 'off') {
84
+	 var xxljob_adminlte_settings = $.cookie('xxljob_adminlte_settings');
85
+	 if (xxljob_adminlte_settings == 'off') {
86
 	 $('body').addClass('sidebar-collapse');
86
 	 $('body').addClass('sidebar-collapse');
87
 	 }
87
 	 }
88
 	 */
88
 	 */

+ 1 - 1
xxl-job-executor-example/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java Dosyayı Görüntüle

9
 
9
 
10
 
10
 
11
 /**
11
 /**
12
- * 广播分片任务
12
+ * 分片广播任务
13
  *
13
  *
14
  * @author xuxueli 2017-07-25 20:56:50
14
  * @author xuxueli 2017-07-25 20:56:50
15
  */
15
  */

+ 1 - 1
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java Dosyayı Görüntüle

9
 
9
 
10
 
10
 
11
 /**
11
 /**
12
- * 广播分片任务
12
+ * 分片广播任务
13
  *
13
  *
14
  * @author xuxueli 2017-07-25 20:56:50
14
  * @author xuxueli 2017-07-25 20:56:50
15
  */
15
  */