Browse Source

事件调度:系统支持Cron、子任务触发、事件触发(API)三种方式触发任务调度;

xuxueli 8 years ago
parent
commit
aef9ef6c66

+ 1 - 0
doc/XXL-JOB官方文档.md View File

992
 - 7、执行器注册线程销毁时, 主动摘除注册机器信息,提高执行器注册的实时性;
992
 - 7、执行器注册线程销毁时, 主动摘除注册机器信息,提高执行器注册的实时性;
993
 - 8、调度中心任务监控线程销毁时,批量对失败任务告警,防止告警信息丢失;
993
 - 8、调度中心任务监控线程销毁时,批量对失败任务告警,防止告警信息丢失;
994
 - 9、调度中心API服务:支持API方式触发任务执行;
994
 - 9、调度中心API服务:支持API方式触发任务执行;
995
+- 10、事件调度:系统支持Cron、子任务触发、事件触发(API)三种方式触发任务调度;
995
 
996
 
996
 ### TODO LIST
997
 ### TODO LIST
997
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
998
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;

+ 4 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java View File

34
 
34
 
35
         // load data
35
         // load data
36
         XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);              // job info
36
         XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);              // job info
37
+        if (jobInfo == null) {
38
+            logger.warn(">>>>>>>>>>>> xxl-job trigger fail, jobId invalid,jobId={}", jobId);
39
+            return;
40
+        }
37
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());  // group info
41
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());  // group info
38
 
42
 
39
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy
43
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy

+ 4 - 15
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java View File

69
                 for (int i = 0; i < childJobKeys.length; i++) {
69
                 for (int i = 0; i < childJobKeys.length; i++) {
70
                     String[] jobKeyArr = childJobKeys[i].split("_");
70
                     String[] jobKeyArr = childJobKeys[i].split("_");
71
                     if (jobKeyArr!=null && jobKeyArr.length==2) {
71
                     if (jobKeyArr!=null && jobKeyArr.length==2) {
72
-                        XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(jobKeyArr[1]));
73
-                        if (childJobInfo!=null) {
74
-                            try {
75
-                                boolean ret = XxlJobDynamicScheduler.triggerJob(String.valueOf(childJobInfo.getId()), String.valueOf(childJobInfo.getJobGroup()));
76
-
77
-                                // add msg
78
-                                childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务成功, 子任务Key: {2}, status: {3}, 子任务描述: {4}",
79
-                                        (i+1), childJobKeys.length, childJobKeys[i], ret, childJobInfo.getJobDesc());
80
-                            } catch (SchedulerException e) {
81
-                                logger.error(e.getMessage(), e);
82
-                            }
83
-                        } else {
84
-                            childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务xxlJobInfo不存在, 子任务Key: {2}",
85
-                                    (i+1), childJobKeys.length, childJobKeys[i]);
86
-                        }
72
+                        ReturnT<String> triggerChildResult = xxlJobService.triggerJob(Integer.valueOf(jobKeyArr[1]));
73
+                        // add msg
74
+                        childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务{2}, 子任务Key: {3}, 子任务触发备注: {4}",
75
+                                (i+1), childJobKeys.length, (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), childJobKeys[i], triggerChildResult.getMsg());
87
                     } else {
76
                     } else {
88
                         childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务Key格式错误, 子任务Key: {2}",
77
                         childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务Key格式错误, 子任务Key: {2}",
89
                                 (i+1), childJobKeys.length, childJobKeys[i]);
78
                                 (i+1), childJobKeys.length, childJobKeys[i]);

+ 5 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java View File

264
 	@Override
264
 	@Override
265
 	public ReturnT<String> triggerJob(int id) {
265
 	public ReturnT<String> triggerJob(int id) {
266
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
266
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
267
+        if (xxlJobInfo == null) {
268
+        	return new ReturnT<String>(ReturnT.FAIL_CODE, "任务ID非法");
269
+		}
270
+
267
         String group = String.valueOf(xxlJobInfo.getJobGroup());
271
         String group = String.valueOf(xxlJobInfo.getJobGroup());
268
         String name = String.valueOf(xxlJobInfo.getId());
272
         String name = String.valueOf(xxlJobInfo.getId());
269
 
273
 
272
 			return ReturnT.SUCCESS;
276
 			return ReturnT.SUCCESS;
273
 		} catch (SchedulerException e) {
277
 		} catch (SchedulerException e) {
274
 			logger.error(e.getMessage(), e);
278
 			logger.error(e.getMessage(), e);
275
-			return ReturnT.FAIL;
279
+			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
276
 		}
280
 		}
277
 	}
281
 	}
278
 
282
 

+ 2 - 2
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl View File

60
 <#macro commonHeader>
60
 <#macro commonHeader>
61
 	<header class="main-header">
61
 	<header class="main-header">
62
 		<a href="${request.contextPath}/" class="logo">
62
 		<a href="${request.contextPath}/" class="logo">
63
-			<span class="logo-mini"><b>X</b>XL</span>
64
-			<span class="logo-lg"><b>任务调度</b>中心</span>
63
+			<span class="logo-mini"><b>XXL</b></span>
64
+			<span class="logo-lg"><b>任务调度中心</b></span>
65
 		</a>
65
 		</a>
66
 		<nav class="navbar navbar-static-top" role="navigation">
66
 		<nav class="navbar navbar-static-top" role="navigation">
67
 			<a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"><span class="sr-only">切换导航</span></a>
67
 			<a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"><span class="sr-only">切换导航</span></a>