Selaa lähdekoodia

任务失败重试优化:收敛并废弃现有失败重试策略,新增任务属性 "失败重试次数",支持自定义失败重试次数,任务失败时将会根据该值进行失败重试;

xuxueli 6 vuotta sitten
vanhempi
commit
c2d6b3ac14
20 muutettua tiedostoa jossa 73 lisäystä ja 113 poistoa
  1. 3 2
      doc/XXL-JOB官方文档.md
  2. 1 1
      doc/db/tables_xxl_job.sql
  3. 3 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
  4. 0 36
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/enums/ExecutorFailStrategyEnum.java
  5. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java
  6. 0 9
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
  7. 9 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
  8. 12 5
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
  9. 21 11
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
  10. 0 8
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
  11. 13 14
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
  12. 6 8
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
  13. 0 1
      xxl-job-admin/src/main/resources/i18n/message.properties
  14. 0 1
      xxl-job-admin/src/main/resources/i18n/message_en.properties
  15. 0 5
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
  16. 4 1
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
  17. 0 2
      xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
  18. 0 3
      xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java
  19. 0 2
      xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java
  20. 0 2
      xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java

+ 3 - 2
doc/XXL-JOB官方文档.md Näytä tiedosto

951
 --- | --- | ---
951
 --- | --- | ---
952
 成功 | IJobHandler.SUCCESS | 0
952
 成功 | IJobHandler.SUCCESS | 0
953
 失败 | IJobHandler.FAIL | -1(其他)
953
 失败 | IJobHandler.FAIL | -1(其他)
954
-失败重试 | IJobHandler.FAIL_RETRY | 101
955
 
954
 
956
 ### 5.16 任务超时控制
955
 ### 5.16 任务超时控制
957
 支持设置任务超时时间,任务运行超时的情况下,将会主动中断任务;
956
 支持设置任务超时时间,任务运行超时的情况下,将会主动中断任务;
1241
 - 22、告警邮件固定使用 UTF-8 编码格式,修复由机器编码导致的邮件乱码问题;
1240
 - 22、告警邮件固定使用 UTF-8 编码格式,修复由机器编码导致的邮件乱码问题;
1242
 - 23、新增任务运行模式 "GLUE模式(PHP) ",支持php脚本任务;
1241
 - 23、新增任务运行模式 "GLUE模式(PHP) ",支持php脚本任务;
1243
 - 24、执行器手动设置IP时取消绑定Host的操作,该IP仅供执行器注册使用;修复指定外网IP时无法绑定执行器Host的问题;
1242
 - 24、执行器手动设置IP时取消绑定Host的操作,该IP仅供执行器注册使用;修复指定外网IP时无法绑定执行器Host的问题;
1244
-- 25、[迭代中]任务失败重试优化:收敛并废弃现有失败重试策略,新增任务属性 "失败重试次数",支持自定义失败重试次数,任务失败时将会根据该值进行失败重试;
1243
+- 25、任务失败重试优化:收敛并废弃现有失败重试策略,如调度失败、执行失败、状态码失败等,新增任务属性 "失败重试次数",支持自定义失败重试次数,任务失败时将会根据该值进行失败重试;
1244
+- 26、【迭代中】父子任务循环限制放开,支持特殊场景;
1245
+- 27、【迭代中】API服务支持动态参数;
1245
 
1246
 
1246
 
1247
 
1247
 ### TODO LIST
1248
 ### TODO LIST

+ 1 - 1
doc/db/tables_xxl_job.sql Näytä tiedosto

162
   `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
162
   `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
163
   `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
163
   `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
164
   `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
164
   `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
165
-  `executor_fail_strategy` varchar(50) DEFAULT NULL COMMENT '失败处理策略',
166
   `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
165
   `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
167
   `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
166
   `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
168
   `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
167
   `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
181
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
180
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
182
   `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
181
   `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
183
   `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
182
   `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
183
+  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
184
   `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
184
   `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
185
   `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
185
   `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
186
   `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志',
186
   `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志',

+ 3 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java Näytä tiedosto

3
 import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
5
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
6
 import com.xxl.job.admin.dao.XxlJobGroupDao;
7
 import com.xxl.job.admin.dao.XxlJobGroupDao;
7
 import com.xxl.job.admin.service.XxlJobService;
8
 import com.xxl.job.admin.service.XxlJobService;
8
 import com.xxl.job.core.biz.model.ReturnT;
9
 import com.xxl.job.core.biz.model.ReturnT;
89
 	@RequestMapping("/trigger")
90
 	@RequestMapping("/trigger")
90
 	@ResponseBody
91
 	@ResponseBody
91
 	public ReturnT<String> triggerJob(int id) {
92
 	public ReturnT<String> triggerJob(int id) {
92
-		return xxlJobService.triggerJob(id);
93
+		JobTriggerPoolHelper.trigger(id, -1);
94
+		return ReturnT.SUCCESS;
93
 	}
95
 	}
94
 	
96
 	
95
 }
97
 }

+ 0 - 36
xxl-job-admin/src/main/java/com/xxl/job/admin/core/enums/ExecutorFailStrategyEnum.java Näytä tiedosto

1
-package com.xxl.job.admin.core.enums;
2
-
3
-/**
4
- * Created by xuxueli on 17/5/9.
5
- */
6
-
7
-@Deprecated
8
-public enum ExecutorFailStrategyEnum {
9
-
10
-    NULL("NULL"),
11
-
12
-    FAIL_TRIGGER_RETRY("FAIL_TRIGGER_RETRY"),
13
-
14
-    FAIL_HANDLE_RETRY("FAIL_HANDLE_RETRY");
15
-
16
-    private final String title;
17
-    private ExecutorFailStrategyEnum(String title) {
18
-        this.title = title;
19
-    }
20
-
21
-    public String getTitle() {
22
-        return title;
23
-    }
24
-
25
-    public static ExecutorFailStrategyEnum match(String name, ExecutorFailStrategyEnum defaultItem) {
26
-        if (name != null) {
27
-            for (ExecutorFailStrategyEnum item: ExecutorFailStrategyEnum.values()) {
28
-                if (item.name().equals(name)) {
29
-                    return item;
30
-                }
31
-            }
32
-        }
33
-        return defaultItem;
34
-    }
35
-
36
-}

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Näytä tiedosto

27
 
27
 
28
 		// trigger
28
 		// trigger
29
 		//XxlJobTrigger.trigger(jobId);
29
 		//XxlJobTrigger.trigger(jobId);
30
-		JobTriggerPoolHelper.trigger(jobId);
30
+		JobTriggerPoolHelper.trigger(jobId, -1);
31
 	}
31
 	}
32
 
32
 
33
 }
33
 }

+ 0 - 9
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java Näytä tiedosto

25
 	private String executorHandler;		    // 执行器,任务Handler名称
25
 	private String executorHandler;		    // 执行器,任务Handler名称
26
 	private String executorParam;		    // 执行器,任务参数
26
 	private String executorParam;		    // 执行器,任务参数
27
 	private String executorBlockStrategy;	// 阻塞处理策略
27
 	private String executorBlockStrategy;	// 阻塞处理策略
28
-	private String executorFailStrategy;	// 失败处理策略
29
 	private int executorTimeout;     		// 任务执行超时时间,单位秒
28
 	private int executorTimeout;     		// 任务执行超时时间,单位秒
30
 	private int executorFailRetryCount;		// 失败重试次数
29
 	private int executorFailRetryCount;		// 失败重试次数
31
 	
30
 	
136
 		this.executorBlockStrategy = executorBlockStrategy;
135
 		this.executorBlockStrategy = executorBlockStrategy;
137
 	}
136
 	}
138
 
137
 
139
-	public String getExecutorFailStrategy() {
140
-		return executorFailStrategy;
141
-	}
142
-
143
-	public void setExecutorFailStrategy(String executorFailStrategy) {
144
-		this.executorFailStrategy = executorFailStrategy;
145
-	}
146
-
147
 	public int getExecutorTimeout() {
138
 	public int getExecutorTimeout() {
148
 		return executorTimeout;
139
 		return executorTimeout;
149
 	}
140
 	}

+ 9 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java Näytä tiedosto

21
 	private String executorAddress;
21
 	private String executorAddress;
22
 	private String executorHandler;
22
 	private String executorHandler;
23
 	private String executorParam;
23
 	private String executorParam;
24
+	private int executorFailRetryCount;
24
 	
25
 	
25
 	// trigger info
26
 	// trigger info
26
 	private Date triggerTime;
27
 	private Date triggerTime;
88
 		this.executorParam = executorParam;
89
 		this.executorParam = executorParam;
89
 	}
90
 	}
90
 
91
 
92
+	public int getExecutorFailRetryCount() {
93
+		return executorFailRetryCount;
94
+	}
95
+
96
+	public void setExecutorFailRetryCount(int executorFailRetryCount) {
97
+		this.executorFailRetryCount = executorFailRetryCount;
98
+	}
99
+
91
 	public Date getTriggerTime() {
100
 	public Date getTriggerTime() {
92
 		return triggerTime;
101
 		return triggerTime;
93
 	}
102
 	}

+ 12 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java Näytä tiedosto

28
             new ThreadPoolExecutor.CallerRunsPolicy());
28
             new ThreadPoolExecutor.CallerRunsPolicy());
29
 
29
 
30
 
30
 
31
-    public void addTrigger(final int jobId){
31
+    public void addTrigger(final int jobId, final int failRetryCount){
32
         triggerPool.execute(new Runnable() {
32
         triggerPool.execute(new Runnable() {
33
             @Override
33
             @Override
34
             public void run() {
34
             public void run() {
35
-                XxlJobTrigger.trigger(jobId);
35
+                XxlJobTrigger.trigger(jobId, failRetryCount);
36
             }
36
             }
37
         });
37
         });
38
     }
38
     }
47
 
47
 
48
     private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
48
     private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
49
 
49
 
50
-
51
-    public static void trigger(int jobId) {
52
-        helper.addTrigger(jobId);
50
+    /**
51
+     *
52
+     * @param jobId
53
+     * @param failRetryCount
54
+     * 			>=0: use this param
55
+     * 			<0: use param from job info config
56
+     *
57
+     */
58
+    public static void trigger(int jobId, int failRetryCount) {
59
+        helper.addTrigger(jobId, failRetryCount);
53
     }
60
     }
54
 
61
 
55
     public static void toStop(){
62
     public static void toStop(){

+ 21 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java Näytä tiedosto

1
 package com.xxl.job.admin.core.trigger;
1
 package com.xxl.job.admin.core.trigger;
2
 
2
 
3
-import com.xxl.job.admin.core.enums.ExecutorFailStrategyEnum;
4
 import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.model.XxlJobLog;
5
 import com.xxl.job.admin.core.model.XxlJobLog;
7
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
8
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
9
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
8
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
9
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
10
 import com.xxl.job.admin.core.util.I18nUtil;
10
 import com.xxl.job.admin.core.util.I18nUtil;
11
 import com.xxl.job.core.biz.ExecutorBiz;
11
 import com.xxl.job.core.biz.ExecutorBiz;
12
 import com.xxl.job.core.biz.model.ReturnT;
12
 import com.xxl.job.core.biz.model.ReturnT;
31
      * trigger job
31
      * trigger job
32
      *
32
      *
33
      * @param jobId
33
      * @param jobId
34
+     * @param failRetryCount
35
+     * 			>=0: use this param
36
+     * 			<0: use param from job info config
37
+     *
34
      */
38
      */
35
-    public static void trigger(int jobId) {
39
+    public static void trigger(int jobId, int failRetryCount) {
36
 
40
 
37
         // load data
41
         // load data
38
         XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);              // job info
42
         XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);              // job info
40
             logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
44
             logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
41
             return;
45
             return;
42
         }
46
         }
47
+        int finalFailRetryCount = jobInfo.getExecutorFailRetryCount();
48
+        if (failRetryCount >= 0) {
49
+            finalFailRetryCount = failRetryCount;
50
+        }
51
+
43
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());  // group info
52
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());  // group info
44
 
53
 
45
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy
54
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy
46
-        ExecutorFailStrategyEnum failStrategy = ExecutorFailStrategyEnum.match(jobInfo.getExecutorFailStrategy(), ExecutorFailStrategyEnum.NULL);    // fail strategy
47
         ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null);    // route strategy
55
         ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null);    // route strategy
48
         ArrayList<String> addressList = (ArrayList<String>) group.getRegistryList();
56
         ArrayList<String> addressList = (ArrayList<String>) group.getRegistryList();
49
 
57
 
64
                 jobLog.setGlueType(jobInfo.getGlueType());
72
                 jobLog.setGlueType(jobInfo.getGlueType());
65
                 jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
73
                 jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
66
                 jobLog.setExecutorParam(jobInfo.getExecutorParam());
74
                 jobLog.setExecutorParam(jobInfo.getExecutorParam());
75
+                jobLog.setExecutorFailRetryCount(finalFailRetryCount);
67
                 jobLog.setTriggerTime(new Date());
76
                 jobLog.setTriggerTime(new Date());
68
 
77
 
69
                 ReturnT<String> triggerResult = new ReturnT<String>(null);
78
                 ReturnT<String> triggerResult = new ReturnT<String>(null);
74
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
83
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
75
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle()).append("("+i+"/"+addressList.size()+")"); // update01
84
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle()).append("("+i+"/"+addressList.size()+")"); // update01
76
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
85
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
77
-                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":").append(jobInfo.getExecutorFailRetryCount());
86
+                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":").append(finalFailRetryCount);
78
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_timeout")).append(":").append(jobInfo.getExecutorTimeout());
87
                 triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_timeout")).append(":").append(jobInfo.getExecutorTimeout());
79
 
88
 
80
                 // 3、trigger-valid
89
                 // 3、trigger-valid
104
                     triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
113
                     triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
105
 
114
 
106
                     // 4.3、trigger (fail retry)
115
                     // 4.3、trigger (fail retry)
107
-                    if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_TRIGGER_RETRY) {
108
-                        triggerResult = runExecutor(triggerParam, address);  // update04
109
-                        triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
116
+                    if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && finalFailRetryCount > 0) {
117
+                        JobTriggerPoolHelper.trigger(jobId, (finalFailRetryCount-1));
118
+                        triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<< </span><br>");
110
                     }
119
                     }
111
                 }
120
                 }
112
 
121
 
134
             jobLog.setGlueType(jobInfo.getGlueType());
143
             jobLog.setGlueType(jobInfo.getGlueType());
135
             jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
144
             jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
136
             jobLog.setExecutorParam(jobInfo.getExecutorParam());
145
             jobLog.setExecutorParam(jobInfo.getExecutorParam());
146
+            jobLog.setExecutorFailRetryCount(finalFailRetryCount);
137
             jobLog.setTriggerTime(new Date());
147
             jobLog.setTriggerTime(new Date());
138
 
148
 
139
             ReturnT<String> triggerResult = new ReturnT<String>(null);
149
             ReturnT<String> triggerResult = new ReturnT<String>(null);
144
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
154
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
145
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle());
155
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle());
146
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
156
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
147
-            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":").append(jobInfo.getExecutorFailRetryCount());
157
+            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":").append(finalFailRetryCount);
148
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_timeout")).append(":").append(jobInfo.getExecutorTimeout());
158
             triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_timeout")).append(":").append(jobInfo.getExecutorTimeout());
149
 
159
 
150
             // 3、trigger-valid
160
             // 3、trigger-valid
174
                 triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
184
                 triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
175
 
185
 
176
                 // 4.3、trigger (fail retry)
186
                 // 4.3、trigger (fail retry)
177
-                if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_TRIGGER_RETRY) {
178
-                    triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList);
179
-                    triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
187
+                if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && finalFailRetryCount > 0) {
188
+                    JobTriggerPoolHelper.trigger(jobId, (finalFailRetryCount-1));
189
+                    triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<< </span><br>");
180
                 }
190
                 }
181
             }
191
             }
182
 
192
 

+ 0 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java Näytä tiedosto

68
 	public ReturnT<String> resume(int id);
68
 	public ReturnT<String> resume(int id);
69
 
69
 
70
 	/**
70
 	/**
71
-	 * trigger job
72
-	 *
73
-	 * @param id
74
-	 * @return
75
-	 */
76
-	public ReturnT<String> triggerJob(int id);
77
-
78
-	/**
79
 	 * dashboard info
71
 	 * dashboard info
80
 	 *
72
 	 *
81
 	 * @return
73
 	 * @return

+ 13 - 14
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java Näytä tiedosto

1
 package com.xxl.job.admin.service.impl;
1
 package com.xxl.job.admin.service.impl;
2
 
2
 
3
-import com.xxl.job.admin.core.enums.ExecutorFailStrategyEnum;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
3
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobLog;
4
 import com.xxl.job.admin.core.model.XxlJobLog;
5
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
6
 import com.xxl.job.admin.core.util.I18nUtil;
6
 import com.xxl.job.admin.core.util.I18nUtil;
7
 import com.xxl.job.admin.dao.XxlJobInfoDao;
7
 import com.xxl.job.admin.dao.XxlJobInfoDao;
8
 import com.xxl.job.admin.dao.XxlJobLogDao;
8
 import com.xxl.job.admin.dao.XxlJobLogDao;
72
                 for (int i = 0; i < childJobIds.length; i++) {
72
                 for (int i = 0; i < childJobIds.length; i++) {
73
                     int childJobId = (StringUtils.isNotBlank(childJobIds[i]) && StringUtils.isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1;
73
                     int childJobId = (StringUtils.isNotBlank(childJobIds[i]) && StringUtils.isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1;
74
                     if (childJobId > 0) {
74
                     if (childJobId > 0) {
75
-                        ReturnT<String> triggerChildResult = xxlJobService.triggerJob(childJobId);
75
+
76
+                        JobTriggerPoolHelper.trigger(childJobId, 0);
77
+                        ReturnT<String> triggerChildResult = ReturnT.SUCCESS;
76
 
78
 
77
                         // add msg
79
                         // add msg
78
                         callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"),
80
                         callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"),
91
 
93
 
92
             }
94
             }
93
         } else {
95
         } else {
94
-            boolean ifHandleRetry = false;
95
-            if (IJobHandler.FAIL_RETRY.getCode() == handleCallbackParam.getExecuteResult().getCode()) {
96
-                ifHandleRetry = true;
97
-            } else {
98
-                XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId());
99
-                if (ExecutorFailStrategyEnum.FAIL_HANDLE_RETRY.name().equals(xxlJobInfo.getExecutorFailStrategy())) {
100
-                    ifHandleRetry = true;
101
-                }
102
-            }
103
-            if (ifHandleRetry){
104
-                ReturnT<String> retryTriggerResult = xxlJobService.triggerJob(log.getJobId());
96
+            XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId());
97
+            if (xxlJobInfo.getExecutorFailRetryCount() > 0) {
98
+                int nextFailRetryCount = xxlJobInfo.getExecutorFailRetryCount()-1;
99
+
100
+                JobTriggerPoolHelper.trigger(log.getJobId(), nextFailRetryCount);
101
+                ReturnT<String> retryTriggerResult = ReturnT.SUCCESS;
102
+
105
                 callbackMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_handle_retry") +"<<<<<<<<<<< </span><br>";
103
                 callbackMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_handle_retry") +"<<<<<<<<<<< </span><br>";
106
 
104
 
107
                 callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_msg1"),
105
                 callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_msg1"),
147
 
145
 
148
     @Override
146
     @Override
149
     public ReturnT<String> triggerJob(int jobId) {
147
     public ReturnT<String> triggerJob(int jobId) {
150
-        return xxlJobService.triggerJob(jobId);
148
+        JobTriggerPoolHelper.trigger(jobId, -1);
149
+        return ReturnT.SUCCESS;
151
     }
150
     }
152
 
151
 
153
 }
152
 }

+ 6 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Näytä tiedosto

4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
5
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
6
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
8
 import com.xxl.job.admin.core.util.I18nUtil;
7
 import com.xxl.job.admin.core.util.I18nUtil;
9
 import com.xxl.job.admin.dao.XxlJobGroupDao;
8
 import com.xxl.job.admin.dao.XxlJobGroupDao;
10
 import com.xxl.job.admin.dao.XxlJobInfoDao;
9
 import com.xxl.job.admin.dao.XxlJobInfoDao;
201
 		exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());
200
 		exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());
202
 		exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());
201
 		exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());
203
 		exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
202
 		exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
204
-		exists_jobInfo.setExecutorFailStrategy(jobInfo.getExecutorFailStrategy());
205
 		exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout());
203
 		exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout());
206
 		exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
204
 		exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
207
 		exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
205
 		exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
268
 		}
266
 		}
269
 	}
267
 	}
270
 
268
 
271
-	@Override
272
-	public ReturnT<String> triggerJob(int id) {
269
+	/*@Override
270
+    public ReturnT<String> triggerJob(int id, int failRetryCount) {
273
 
271
 
274
-		JobTriggerPoolHelper.trigger(id);
272
+		JobTriggerPoolHelper.trigger(id, failRetryCount);
275
 		return ReturnT.SUCCESS;
273
 		return ReturnT.SUCCESS;
276
 
274
 
277
-        /*XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
275
+        *//*XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
278
         if (xxlJobInfo == null) {
276
         if (xxlJobInfo == null) {
279
         	return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_unvalid")) );
277
         	return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_unvalid")) );
280
 		}
278
 		}
288
 		} catch (SchedulerException e) {
286
 		} catch (SchedulerException e) {
289
 			logger.error(e.getMessage(), e);
287
 			logger.error(e.getMessage(), e);
290
 			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
288
 			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
291
-		}*/
289
+		}*//*
292
 
290
 
293
-	}
291
+	}*/
294
 
292
 
295
 	@Override
293
 	@Override
296
 	public Map<String, Object> dashboardInfo() {
294
 	public Map<String, Object> dashboardInfo() {

+ 0 - 1
xxl-job-admin/src/main/resources/i18n/message.properties Näytä tiedosto

162
 joblog_handleCode_200=成功
162
 joblog_handleCode_200=成功
163
 joblog_handleCode_500=失败
163
 joblog_handleCode_500=失败
164
 joblog_handleCode_502=失败(超时)
164
 joblog_handleCode_502=失败(超时)
165
-joblog_handleCode_501=失败(重试)
166
 joblog_kill_log=终止任务
165
 joblog_kill_log=终止任务
167
 joblog_kill_log_limit=调度失败,无法终止日志
166
 joblog_kill_log_limit=调度失败,无法终止日志
168
 joblog_kill_log_byman=人为操作主动终止
167
 joblog_kill_log_byman=人为操作主动终止

+ 0 - 1
xxl-job-admin/src/main/resources/i18n/message_en.properties Näytä tiedosto

162
 joblog_handleCode_200=Success
162
 joblog_handleCode_200=Success
163
 joblog_handleCode_500=Fail
163
 joblog_handleCode_500=Fail
164
 joblog_handleCode_502=Timeout
164
 joblog_handleCode_502=Timeout
165
-joblog_handleCode_501=Fail retry
166
 joblog_kill_log=Kill Job
165
 joblog_kill_log=Kill Job
167
 joblog_kill_log_limit=Trigger Fail, can not kill job
166
 joblog_kill_log_limit=Trigger Fail, can not kill job
168
 joblog_kill_log_byman=Manual operation to active kill job
167
 joblog_kill_log_byman=Manual operation to active kill job

+ 0 - 5
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Näytä tiedosto

20
 		<result column="executor_handler" property="executorHandler" />
20
 		<result column="executor_handler" property="executorHandler" />
21
 	    <result column="executor_param" property="executorParam" />
21
 	    <result column="executor_param" property="executorParam" />
22
 		<result column="executor_block_strategy" property="executorBlockStrategy" />
22
 		<result column="executor_block_strategy" property="executorBlockStrategy" />
23
-		<result column="executor_fail_strategy" property="executorFailStrategy" />
24
 		<result column="executor_timeout" property="executorTimeout" />
23
 		<result column="executor_timeout" property="executorTimeout" />
25
 		<result column="executor_fail_retry_count" property="executorFailRetryCount" />
24
 		<result column="executor_fail_retry_count" property="executorFailRetryCount" />
26
 
25
 
45
 		t.executor_handler,
44
 		t.executor_handler,
46
 		t.executor_param,
45
 		t.executor_param,
47
 		t.executor_block_strategy,
46
 		t.executor_block_strategy,
48
-		t.executor_fail_strategy,
49
 		t.executor_timeout,
47
 		t.executor_timeout,
50
 		t.executor_fail_retry_count,
48
 		t.executor_fail_retry_count,
51
 		t.glue_type,
49
 		t.glue_type,
102
 			executor_handler,
100
 			executor_handler,
103
 			executor_param,
101
 			executor_param,
104
 			executor_block_strategy,
102
 			executor_block_strategy,
105
-			executor_fail_strategy,
106
 			executor_timeout,
103
 			executor_timeout,
107
 			executor_fail_retry_count,
104
 			executor_fail_retry_count,
108
 			glue_type,
105
 			glue_type,
122
 			#{executorHandler},
119
 			#{executorHandler},
123
 			#{executorParam},
120
 			#{executorParam},
124
 			#{executorBlockStrategy},
121
 			#{executorBlockStrategy},
125
-			#{executorFailStrategy},
126
 			#{executorTimeout},
122
 			#{executorTimeout},
127
 			#{executorFailRetryCount},
123
 			#{executorFailRetryCount},
128
 			#{glueType},
124
 			#{glueType},
155
 			executor_handler = #{executorHandler},
151
 			executor_handler = #{executorHandler},
156
 			executor_param = #{executorParam},
152
 			executor_param = #{executorParam},
157
 			executor_block_strategy = #{executorBlockStrategy},
153
 			executor_block_strategy = #{executorBlockStrategy},
158
-			executor_fail_strategy = #{executorFailStrategy},
159
 			executor_timeout = ${executorTimeout},
154
 			executor_timeout = ${executorTimeout},
160
 			executor_fail_retry_count = ${executorFailRetryCount},
155
 			executor_fail_retry_count = ${executorFailRetryCount},
161
 			glue_type = #{glueType},
156
 			glue_type = #{glueType},

+ 4 - 1
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml Näytä tiedosto

14
 		<result column="executor_address" property="executorAddress" />
14
 		<result column="executor_address" property="executorAddress" />
15
 		<result column="executor_handler" property="executorHandler" />
15
 		<result column="executor_handler" property="executorHandler" />
16
 	    <result column="executor_param" property="executorParam" />
16
 	    <result column="executor_param" property="executorParam" />
17
+		<result column="executor_fail_retry_count" property="executorFailRetryCount" />
17
 	    
18
 	    
18
 	    <result column="trigger_time" property="triggerTime" />
19
 	    <result column="trigger_time" property="triggerTime" />
19
 	    <result column="trigger_code" property="triggerCode" />
20
 	    <result column="trigger_code" property="triggerCode" />
33
 		t.executor_address,
34
 		t.executor_address,
34
 		t.executor_handler,
35
 		t.executor_handler,
35
 		t.executor_param,
36
 		t.executor_param,
37
+		t.executor_fail_retry_count,
36
 		t.trigger_time,
38
 		t.trigger_time,
37
 		t.trigger_code,
39
 		t.trigger_code,
38
 		t.trigger_msg,
40
 		t.trigger_msg,
140
 			`trigger_msg`= #{triggerMsg},
142
 			`trigger_msg`= #{triggerMsg},
141
 			`executor_address`= #{executorAddress},
143
 			`executor_address`= #{executorAddress},
142
 			`executor_handler`=#{executorHandler},
144
 			`executor_handler`=#{executorHandler},
143
-			`executor_param`= #{executorParam}
145
+			`executor_param`= #{executorParam},
146
+			`executor_fail_retry_count`= #{executorFailRetryCount}
144
 		WHERE `id`= #{id}
147
 		WHERE `id`= #{id}
145
 	</update>
148
 	</update>
146
 
149
 

+ 0 - 2
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js Näytä tiedosto

157
                                 html = '<span style="color: green">'+ I18n.joblog_handleCode_200 +'</span>';
157
                                 html = '<span style="color: green">'+ I18n.joblog_handleCode_200 +'</span>';
158
                             } else if (data == 500) {
158
                             } else if (data == 500) {
159
                                 html = '<span style="color: red">'+ I18n.joblog_handleCode_500 +'</span>';
159
                                 html = '<span style="color: red">'+ I18n.joblog_handleCode_500 +'</span>';
160
-                            } else if (data == 501) {
161
-                                html = '<span style="color: red">'+ I18n.joblog_handleCode_501 +'</span>';
162
                             } else if (data == 502) {
160
                             } else if (data == 502) {
163
                                 html = '<span style="color: red">'+ I18n.joblog_handleCode_502 +'</span>';
161
                                 html = '<span style="color: red">'+ I18n.joblog_handleCode_502 +'</span>';
164
                             } else if (data == 0) {
162
                             } else if (data == 0) {

+ 0 - 3
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java Näytä tiedosto

1
 package com.xxl.job.admin.dao;
1
 package com.xxl.job.admin.dao;
2
 
2
 
3
 import com.xxl.job.admin.core.model.XxlJobInfo;
3
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
-import com.xxl.job.admin.dao.XxlJobInfoDao;
5
 import org.junit.Test;
4
 import org.junit.Test;
6
 import org.junit.runner.RunWith;
5
 import org.junit.runner.RunWith;
7
 import org.springframework.test.context.ContextConfiguration;
6
 import org.springframework.test.context.ContextConfiguration;
41
 		info.setExecutorHandler("setExecutorHandler");
40
 		info.setExecutorHandler("setExecutorHandler");
42
 		info.setExecutorParam("setExecutorParam");
41
 		info.setExecutorParam("setExecutorParam");
43
 		info.setExecutorBlockStrategy("setExecutorBlockStrategy");
42
 		info.setExecutorBlockStrategy("setExecutorBlockStrategy");
44
-		info.setExecutorFailStrategy("setExecutorFailStrategy");
45
 		info.setGlueType("setGlueType");
43
 		info.setGlueType("setGlueType");
46
 		info.setGlueSource("setGlueSource");
44
 		info.setGlueSource("setGlueSource");
47
 		info.setGlueRemark("setGlueRemark");
45
 		info.setGlueRemark("setGlueRemark");
58
 		info2.setExecutorHandler("setExecutorHandler2");
56
 		info2.setExecutorHandler("setExecutorHandler2");
59
 		info2.setExecutorParam("setExecutorParam2");
57
 		info2.setExecutorParam("setExecutorParam2");
60
 		info2.setExecutorBlockStrategy("setExecutorBlockStrategy2");
58
 		info2.setExecutorBlockStrategy("setExecutorBlockStrategy2");
61
-		info2.setExecutorFailStrategy("setExecutorFailStrategy2");
62
 		info2.setGlueType("setGlueType2");
59
 		info2.setGlueType("setGlueType2");
63
 		info2.setGlueSource("setGlueSource2");
60
 		info2.setGlueSource("setGlueSource2");
64
 		info2.setGlueRemark("setGlueRemark2");
61
 		info2.setGlueRemark("setGlueRemark2");

+ 0 - 2
xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java Näytä tiedosto

14
 	public static final ReturnT<String> SUCCESS = new ReturnT<String>(200, null);
14
 	public static final ReturnT<String> SUCCESS = new ReturnT<String>(200, null);
15
 	/** fail */
15
 	/** fail */
16
 	public static final ReturnT<String> FAIL = new ReturnT<String>(500, null);
16
 	public static final ReturnT<String> FAIL = new ReturnT<String>(500, null);
17
-	/** fail retry */
18
-	public static final ReturnT<String> FAIL_RETRY = new ReturnT<String>(501, null);
19
 	/** fail timeout */
17
 	/** fail timeout */
20
 	public static final ReturnT<String> FAIL_TIMEOUT = new ReturnT<String>(502, null);
18
 	public static final ReturnT<String> FAIL_TIMEOUT = new ReturnT<String>(502, null);
21
 
19
 

+ 0 - 2
xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java Näytä tiedosto

66
 
66
 
67
         if (exitValue == 0) {
67
         if (exitValue == 0) {
68
             return IJobHandler.SUCCESS;
68
             return IJobHandler.SUCCESS;
69
-        } else if (exitValue == 101) {
70
-            return IJobHandler.FAIL_RETRY;
71
         } else {
69
         } else {
72
             return new ReturnT<String>(IJobHandler.FAIL.getCode(), "script exit value("+exitValue+") is failed");
70
             return new ReturnT<String>(IJobHandler.FAIL.getCode(), "script exit value("+exitValue+") is failed");
73
         }
71
         }