Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
06cf9f8a
提交
06cf9f8a
authored
7月 25, 2017
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新RM
上级
0c03f634
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
41 行增加
和
32 行删除
+41
-32
README.md
README.md
+1
-0
XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+24
-16
ExecutorRouteStrategyEnum.java
...m/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java
+1
-1
XxlJobTrigger.java
...in/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
+1
-1
help.ftl
xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl
+1
-1
index.ftl
xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl
+1
-1
jobgroup.index.ftl
.../main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl
+1
-1
jobinfo.index.ftl
...rc/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
+1
-1
joblog.index.ftl
.../src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl
+1
-1
common.1.js
xxl-job-admin/src/main/webapp/static/js/common.1.js
+7
-7
ShardingJobHandler.java
...l/job/executor/service/jobhandler/ShardingJobHandler.java
+1
-1
ShardingJobHandler.java
...l/job/executor/service/jobhandler/ShardingJobHandler.java
+1
-1
没有找到文件。
README.md
浏览文件 @
06cf9f8a
...
...
@@ -38,6 +38,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
-
20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
-
21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
-
22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
-
23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
### 架构图
...
...
doc/XXL-JOB官方文档.md
浏览文件 @
06cf9f8a
...
...
@@ -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
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java
浏览文件 @
06cf9f8a
...
...
@@ -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
;
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
浏览文件 @
06cf9f8a
...
...
@@ -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
);
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl
浏览文件 @
06cf9f8a
...
...
@@ -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
/>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl
浏览文件 @
06cf9f8a
...
...
@@ -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
/>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl
浏览文件 @
06cf9f8a
...
...
@@ -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
/>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
浏览文件 @
06cf9f8a
...
...
@@ -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
/>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl
浏览文件 @
06cf9f8a
...
...
@@ -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
/>
...
...
xxl-job-admin/src/main/webapp/static/js/common.1.js
浏览文件 @
06cf9f8a
...
...
@@ -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');
}
*/
...
...
xxl-job-executor-example/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java
浏览文件 @
06cf9f8a
...
...
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Service;
/**
*
广播分片
任务
*
分片广播
任务
*
* @author xuxueli 2017-07-25 20:56:50
*/
...
...
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java
浏览文件 @
06cf9f8a
...
...
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Service;
/**
*
广播分片
任务
*
分片广播
任务
*
* @author xuxueli 2017-07-25 20:56:50
*/
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论