v1.8.2
xuxueli 7 years ago
parent 0c03f6348c
commit 06cf9f8a1c

@ -38,6 +38,7 @@ XXL-JOB是一个轻量级分布式任务调度框架其核心设计目标是
- 20、脚本任务支持以GLUE模式开发和运行脚本任务包括Shell、Python等类型脚本;
- 21、阻塞处理策略调度过于密集执行器来不及处理时的处理策略策略包括单机串行默认、丢弃后续调度、覆盖之前调度
- 22、失败处理策略调度失败时的处理策略策略包括失败告警默认、失败重试
- 23、分片广播任务执行器集群部署时任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
### 架构图

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

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

@ -42,7 +42,7 @@ public class XxlJobTrigger {
ArrayList<String> addressList = (ArrayList<String>) group.getRegistryList();
// broadcast
if (ExecutorRouteStrategyEnum.BROADCAST == executorRouteStrategyEnum && CollectionUtils.isNotEmpty(addressList)) {
if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum && CollectionUtils.isNotEmpty(addressList)) {
for (int i = 0; i < addressList.size(); i++) {
String address = addressList.get(i);

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

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

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

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

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

@ -71,18 +71,18 @@ $(function(){
// 左侧菜单状态js + 后端 + cookie方式
$('.sidebar-toggle').click(function(){
var adminlte_settings = $.cookie('adminlte_settings'); // 左侧菜单展开状态[adminlte_settings]on=展开off=折叠
if ('off' == adminlte_settings) {
adminlte_settings = 'on';
var xxljob_adminlte_settings = $.cookie('xxljob_adminlte_settings'); // 左侧菜单展开状态[xxljob_adminlte_settings]on=展开off=折叠
if ('off' == xxljob_adminlte_settings) {
xxljob_adminlte_settings = 'on';
} else {
adminlte_settings = 'off';
xxljob_adminlte_settings = 'off';
}
$.cookie('adminlte_settings', adminlte_settings, { expires: 7 }); //$.cookie('the_cookie', '', { expires: -1 });
$.cookie('xxljob_adminlte_settings', xxljob_adminlte_settings, { expires: 7 }); //$.cookie('the_cookie', '', { expires: -1 });
});
// 左侧菜单状态js + cookie方式遗弃
/*
var adminlte_settings = $.cookie('adminlte_settings');
if (adminlte_settings == 'off') {
var xxljob_adminlte_settings = $.cookie('xxljob_adminlte_settings');
if (xxljob_adminlte_settings == 'off') {
$('body').addClass('sidebar-collapse');
}
*/

@ -9,7 +9,7 @@ import org.springframework.stereotype.Service;
/**
* 广
* 广
*
* @author xuxueli 2017-07-25 20:56:50
*/

@ -9,7 +9,7 @@ import org.springframework.stereotype.Service;
/**
* 广
* 广
*
* @author xuxueli 2017-07-25 20:56:50
*/

Loading…
Cancel
Save