Explorar el Código

脚本任务,底层逻辑调整

xueli.xue hace 8 años
padre
commit
f93302a546

+ 28 - 27
README.md Ver fichero

@@ -24,7 +24,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
24 24
 - 17、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移;
25 25
 - 18、Rolling日志:支持以Rolling方式实时查看执行器输出的日志信息,实时监控任务进度;
26 26
 - 19、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
27
-- 20、脚本任务:支持开发脚本任务,如Shell、Python和Groovy等脚本;
27
+- 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
28 28
 
29 29
 #### 1.3 发展
30 30
 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
@@ -57,6 +57,10 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
57 57
 	- 16、深圳麦亚信科技股份有限公司
58 58
 	- 17、上海博莹科技信息技术有限公司
59 59
 	- 18、中国平安科技有限公司
60
+	- 19、杭州知时信息科技有限公司
61
+	- 20、博莹科技(上海)有限公司
62
+	- 21、成都依能股份有限责任公司
63
+	- 22、湖南高阳通联信息技术有限公司
60 64
 	- ……
61 65
 
62 66
 欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
@@ -167,7 +171,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
167 171
 
168 172
 ![输入图片说明](https://static.oschina.net/uploads/img/201703/13150738_Fv8v.png "在这里输入图片标题")
169 173
 
170
-    ### 执行器JDBC链接:请保持和调度中心JDBC连接配置一致;(执行器 "DbRegistHelper" 和 "DbGlueLoader" 依赖JDBC配置; 推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖)
174
+    ### 执行器JDBC链接:请保持和调度中心JDBC连接配置一致;(执行器 "DbRegistHelper" 依赖JDBC配置;推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置; )
171 175
     xxl.job.db.driverClass=com.mysql.jdbc.Driver
172 176
     xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
173 177
     xxl.job.db.user=root
@@ -181,51 +185,48 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
181 185
 
182 186
 **组件配置**:配置内容如下图所示。
183 187
 
184
-![输入图片说明](https://static.oschina.net/uploads/img/201703/13151030_Afad.png "在这里输入图片标题")
188
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27204724_WW5m.png "在这里输入图片标题")
185 189
 
186 190
     1、JobHandler 扫描路径:自动扫描容器中JobHandler;
187
-    3、执行器注册器(XxlJobExecutor.registHelper): 默认使用系统提供的 "DbRegistHelper"(依赖JDBC), 推荐将其改为公共的RPC服务
188
-    3、GLUE源码加载器(GlueFactory.glueLoader): 默认使用系统提供的 "DbGlueLoader"(依赖JDBC), 推荐将其改为公共的RPC服务
189
-    4、XXL-JOB公共数据源 "xxlJobDataSource": 仅在启动 "DbRegistHelper" 或 "DbGlueLoader" 时才需要, 否则可删除
191
+    2、执行器注册器(XxlJobExecutor.registHelper): 默认使用系统提供的 "DbRegistHelper"(依赖JDBC), 推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置; )
192
+    3、XXL-JOB公共数据源 "xxlJobDataSource": 仅在启动 "DbRegistHelper" 或 "DbGlueLoader" 时才需要, 否则可删除
190 193
 
191 194
 **部署项目**:       
192 195
 至此“执行器”项目已经部署结束。
193 196
 
194 197
 #### 2.5 开发第一个任务“Hello World”       
195
-本示例为新建一个“GLUE模式任务”(“GLUE模式任务”的执行代码支持托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量)。更多有关任务的详细配置,请查看“章节三:任务详解”。
198
+本示例以新建一个 “GLUE模式(Java)” 运行模式的任务为例。更多有关任务的详细配置,请查看“章节三:任务详解”。
199
+( “GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量)
196 200
 
197 201
 **前提:请确认“调度中心”和“执行器”项目已经成功部署并启动;**
198 202
 
199
-- **步骤一(新建任务)**:        
203
+- **步骤一:新建任务**:
200 204
 登陆调度中心,点击下图所示“新建任务”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。
201 205
 
202
-![输入图片说明](https://static.oschina.net/uploads/img/201703/12220807_amrb.png "在这里输入图片标题")
203
-
204
-![输入图片说明](https://static.oschina.net/uploads/img/201703/12220856_rd3R.png "在这里输入图片标题")
205
-
206
-- **步骤二(GLUE任务开发)**:        
207
-请点击下图中所示“GLUE入口按钮”,进入“GLUE编辑器开发界面”,见下图。GLUE任务默认已经初始化了示例任务代码,即打印Hello World。
208
-(GLUE实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务,详细介绍请查看第三章节)
209
-
210
-![输入图片说明](https://static.oschina.net/uploads/img/201610/03200312_EhFJ.png "在这里输入图片标题")
206
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27205910_o8HQ.png "在这里输入图片标题")
211 207
 
212
-![输入图片说明](https://static.oschina.net/uploads/img/201703/25124117_hYaV.png "在这里输入图片标题")
208
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27210202_SE2u.png "在这里输入图片标题")
213 209
 
214
-- **步骤三(触发执行)**:    
215
-点击下图所示“执行”按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度出发)。
210
+- **步骤二:“GLUE模式(Java)” 任务开发**:
211
+请点击任务右侧 “GLUE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。
212
+( “GLUE模式(Java)” 运行模式的任务实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务,详细介绍请查看第三章节)
216 213
 
217
-![输入图片说明](https://static.oschina.net/uploads/img/201703/12221021_uD5l.png "在这里输入图片标题")
214
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27210307_Fgql.png "在这里输入图片标题")
218 215
 
219
-- **步骤四(查看日志)**:   
216
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27210314_dNUJ.png "在这里输入图片标题")
220 217
 
221
-点击任务右侧“日志”按钮,可前往任务日志界面查看任务日志。
222
-![输入图片说明](https://static.oschina.net/uploads/img/201703/12221130_jYQi.png "在这里输入图片标题")
218
+- **步骤三:触发执行**:
219
+请点击任务右侧 “执行” 按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度出发)。
223 220
 
221
+- **步骤四:查看日志**: 
222
+请点击任务右侧 “日志” 按钮,可前往任务日志界面查看任务日志。
224 223
 在任务日志界面中,可查看该任务的历史调度记录以及每一次调度的任务调度信息、执行参数和执行信息。运行中的任务点击右侧的“执行日志”按钮,可进入日志控制台查看实时执行日志。
225
-![输入图片说明](https://static.oschina.net/uploads/img/201703/12221436_c8Ru.png "在这里输入图片标题")
224
+
225
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27211624_E26X.png "在这里输入图片标题")
226 226
 
227 227
 在日志控制台,可以Rolling方式实时查看任务在执行器一侧运行输出的日志信息,实时监控任务进度;
228
-![输入图片说明](https://static.oschina.net/uploads/img/201703/25124816_tvGI.png "在这里输入图片标题")
228
+
229
+![输入图片说明](https://static.oschina.net/uploads/img/201704/27211631_eYrv.png "在这里输入图片标题")
229 230
 
230 231
 ## 三、任务详解
231 232
 
@@ -785,7 +786,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
785 786
 - 4、路由策越优化:循环和LFU路由策略计数器自增无上限问题和首次路由压力集中在首台机器的问题修复;
786 787
 
787 788
 #### 6.14 版本 V1.7.0 特性 (Coding)
788
-- 1、支持脚本JOB(源码或指定路径), 即shell/python/php等, 日志实时输出并支持在线监控;定制JobHandler实现;
789
+- 1、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
789 790
 
790 791
 
791 792
 #### TODO LIST

+ 1 - 0
db/tables_xxl_job.sql Ver fichero

@@ -169,6 +169,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
169 169
   `id` int(11) NOT NULL AUTO_INCREMENT,
170 170
   `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
171 171
   `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
172
+  `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
172 173
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
173 174
   `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
174 175
   `executor_param` varchar(255) DEFAULT NULL COMMENT 'executor_param',

+ 1 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Ver fichero

@@ -50,6 +50,7 @@ public class RemoteHttpJobBean extends QuartzJobBean {
50 50
 
51 51
 		// log part-2 param
52 52
 		//jobLog.setExecutorAddress(executorAddress);
53
+		jobLog.setGlueType(jobInfo.getGlueType());
53 54
 		jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
54 55
 		jobLog.setExecutorParam(jobInfo.getExecutorParam());
55 56
 		jobLog.setTriggerTime(new Date());

+ 11 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java Ver fichero

@@ -14,6 +14,9 @@ public class XxlJobLog {
14 14
 	private int jobGroup;
15 15
 	private int jobId;
16 16
 
17
+	// glueType
18
+	private String glueType;
19
+
17 20
 	// execute info
18 21
 	private String executorAddress;
19 22
 	private String executorHandler;
@@ -53,6 +56,14 @@ public class XxlJobLog {
53 56
 		this.jobId = jobId;
54 57
 	}
55 58
 
59
+	public String getGlueType() {
60
+		return glueType;
61
+	}
62
+
63
+	public void setGlueType(String glueType) {
64
+		this.glueType = glueType;
65
+	}
66
+
56 67
 	public String getExecutorAddress() {
57 68
 		return executorAddress;
58 69
 	}

+ 5 - 1
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml Ver fichero

@@ -9,7 +9,9 @@
9 9
 		<result column="job_group" property="jobGroup" />
10 10
 		<result column="job_id" property="jobId" />
11 11
 
12
-	    <result column="executor_address" property="executorAddress" />
12
+		<result column="glue_type" property="glueType" />
13
+
14
+		<result column="executor_address" property="executorAddress" />
13 15
 		<result column="executor_handler" property="executorHandler" />
14 16
 	    <result column="executor_param" property="executorParam" />
15 17
 	    
@@ -27,6 +29,7 @@
27 29
 		t.id,
28 30
 		t.job_group,
29 31
 		t.job_id,
32
+		t.glue_type,
30 33
 		t.executor_address,
31 34
 		t.executor_handler,
32 35
 		t.executor_param,
@@ -101,6 +104,7 @@
101 104
 	<update id="updateTriggerInfo">
102 105
 		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
103 106
 		SET
107
+		    `glue_type`= #{glueType},
104 108
 			`trigger_time`= #{triggerTime},
105 109
 			`trigger_code`= #{triggerCode},
106 110
 			`trigger_msg`= #{triggerMsg},

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl Ver fichero

@@ -170,7 +170,7 @@
170 170
 
171 171
 <#macro commonFooter >
172 172
 	<footer class="main-footer">
173
-        Powered by <b>XXL-JOB</b> 1.6
173
+        Powered by <b>XXL-JOB</b> 1.7
174 174
 		<div class="pull-right hidden-xs">
175 175
             <strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;
176 176
                 <a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>&nbsp;

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

@@ -81,7 +81,7 @@
81 81
                                         <th name="triggerCode" >调度结果</th>
82 82
                                         <th name="triggerMsg" >调度备注</th>
83 83
 					                  	<th name="executorAddress" >执行器地址</th>
84
-                                        <th name="executorHandler" >JobHandler</th>
84
+                                        <th name="glueType" >运行模式</th>
85 85
 					                  	<th name="executorParam" >任务参数</th>
86 86
 					                  	<th name="handleTime" >执行时间</th>
87 87
 					                  	<th name="handleCode" >执行结果</th>

+ 1 - 1
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js Ver fichero

@@ -56,7 +56,7 @@ $(function() {
56 56
 							} else if ('GLUE_PYTHON'==row.glueType) {
57 57
 								return "GLUE模式(Python)";
58 58
 							} else if ('BEAN'==row.glueType) {
59
-								return row.executorHandler;
59
+								return "BEAN模式:" + row.executorHandler;
60 60
 							}
61 61
 							return row.executorHandler;
62 62
 						}

+ 11 - 2
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js Ver fichero

@@ -108,10 +108,19 @@ $(function() {
108 108
 					},
109 109
 	                { "data": 'executorAddress', "visible" : true},
110 110
 					{
111
-						"data": 'executorHandler',
111
+						"data": 'glueType',
112 112
 						"visible" : true,
113 113
 						"render": function ( data, type, row ) {
114
-							return (row.executorHandler)?row.executorHandler:"GLUE模式";
114
+							if ('GLUE_GROOVY'==row.glueType) {
115
+								return "GLUE模式(Java)";
116
+							} else if ('GLUE_SHELL'==row.glueType) {
117
+								return "GLUE模式(Shell)";
118
+							} else if ('GLUE_PYTHON'==row.glueType) {
119
+								return "GLUE模式(Python)";
120
+							} else if ('BEAN'==row.glueType) {
121
+								return "BEAN模式:" + row.executorHandler;
122
+							}
123
+							return row.executorHandler;
115 124
 						}
116 125
 					},
117 126
 	                { "data": 'executorParam', "visible" : true},

+ 2 - 2
xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml Ver fichero

@@ -28,9 +28,9 @@
28 28
 		<!-- 执行器端口号 -->
29 29
 		<property name="port" value="${xxl.job.executor.port}" />
30 30
         <property name="appName" value="${xxl.job.executor.appname}" />
31
-        <!-- 执行器注册器,默认使用系统提供的 "DbRegistHelper", 推荐将其改为公共的RPC服务 -->
31
+        <!-- 执行器注册器 -->
32 32
         <property name="registHelper" >
33
-            <!-- DbRegistHelper, 依赖 "XXL-JOB公共数据源" -->
33
+            <!-- 执行器 "DbRegistHelper" 依赖 "XXL-JOB公共数据源" ;推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置;  -->
34 34
             <bean class="com.xxl.job.core.registry.impl.DbRegistHelper" >
35 35
                 <!-- XXL-JOB公共数据源 -->
36 36
                 <property name="dataSource" ref="xxlJobDataSource" />