Browse Source

分片任务失败重试优化,仅重试当前失败的分片;

xuxueli 6 years ago
parent
commit
b1b15569c6

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

@@ -45,32 +45,44 @@ public class XxlJobTrigger {
45 45
         int finalFailRetryCount = failRetryCount>=0?failRetryCount:jobInfo.getExecutorFailRetryCount();
46 46
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
47 47
 
48
-        // process trigger
49
-        if (triggerType==TriggerTypeEnum.RETRY && executorShardingParam!=null) {
48
+        // sharding param
49
+        int[] shardingParam = null;
50
+        if (executorShardingParam!=null){
50 51
             String[] shardingArr = executorShardingParam.split("/");
51
-            if (shardingArr.length==2 && StringUtils.isNumeric(shardingArr[0]) && StringUtils.isNumeric(shardingArr[1])); {
52
-                processTrigger(group, jobInfo, finalFailRetryCount, triggerType, Integer.valueOf(shardingArr[0]), Integer.valueOf(shardingArr[1]));
52
+            if (shardingArr.length==2 && StringUtils.isNumeric(shardingArr[0]) && StringUtils.isNumeric(shardingArr[1])) {
53
+                shardingParam = new int[2];
54
+                shardingParam[0] = Integer.valueOf(shardingArr[0]);
55
+                shardingParam[1] = Integer.valueOf(shardingArr[1]);
56
+            }
57
+        }
58
+        if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null)
59
+                && CollectionUtils.isNotEmpty(group.getRegistryList()) && shardingParam==null) {
60
+            for (int i = 0; i < group.getRegistryList().size(); i++) {
61
+                processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size());
53 62
             }
54 63
         } else {
55
-            if (CollectionUtils.isNotEmpty(group.getRegistryList())) {
56
-                if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null)) {
57
-                    for (int i = 0; i < group.getRegistryList().size(); i++) {
58
-                        processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size());
59
-                    }
60
-                } else {
61
-                    processTrigger(group, jobInfo, finalFailRetryCount, triggerType, 0, 1);
62
-                }
63
-            } else {
64
-                processTrigger(group, jobInfo, finalFailRetryCount, triggerType, 0, 0);
64
+            if (shardingParam == null) {
65
+                shardingParam = new int[]{0, 1};
65 66
             }
67
+            processTrigger(group, jobInfo, finalFailRetryCount, triggerType, shardingParam[0], shardingParam[1]);
66 68
         }
69
+
67 70
     }
68 71
 
72
+    /**
73
+     * @param group                     job group, registry list may be empty
74
+     * @param jobInfo
75
+     * @param finalFailRetryCount
76
+     * @param triggerType
77
+     * @param index                     sharding index
78
+     * @param total                     sharding index
79
+     */
69 80
     private static void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total){
70 81
 
71 82
         // param
72 83
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy
73 84
         ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null);    // route strategy
85
+        String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum)?String.valueOf(index).concat("/").concat(String.valueOf(total)):null;
74 86
 
75 87
         // 1、save log-id
76 88
         XxlJobLog jobLog = new XxlJobLog();
@@ -98,10 +110,13 @@ public class XxlJobTrigger {
98 110
         // 3、init address
99 111
         String address = null;
100 112
         ReturnT<String> routeAddressResult = null;
101
-        String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum &&total>0)?String.valueOf(triggerParam.getBroadcastIndex()).concat("/").concat(String.valueOf(triggerParam.getBroadcastTotal())):null;
102 113
         if (CollectionUtils.isNotEmpty(group.getRegistryList())) {
103 114
             if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) {
104
-                address = group.getRegistryList().get(index);
115
+                if (index < group.getRegistryList().size()) {
116
+                    address = group.getRegistryList().get(index);
117
+                } else {
118
+                    address = group.getRegistryList().get(0);
119
+                }
105 120
             } else {
106 121
                 routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList());
107 122
                 if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) {