Просмотр исходного кода

调度中心任务注册检测逻辑优化;

xuxueli 8 лет назад
Родитель
Сommit
7b052d7331

+ 0 - 18
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java Просмотреть файл

1
 package com.xxl.job.admin.controller;
1
 package com.xxl.job.admin.controller;
2
 
2
 
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.thread.JobRegistryMonitorHelper;
5
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
4
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
6
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
5
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
7
 import com.xxl.job.core.biz.model.ReturnT;
6
 import com.xxl.job.core.biz.model.ReturnT;
8
-import com.xxl.job.core.enums.RegistryConfig;
9
-import org.apache.commons.collections.CollectionUtils;
10
 import org.apache.commons.lang.StringUtils;
7
 import org.apache.commons.lang.StringUtils;
11
 import org.springframework.stereotype.Controller;
8
 import org.springframework.stereotype.Controller;
12
 import org.springframework.ui.Model;
9
 import org.springframework.ui.Model;
14
 import org.springframework.web.bind.annotation.ResponseBody;
11
 import org.springframework.web.bind.annotation.ResponseBody;
15
 
12
 
16
 import javax.annotation.Resource;
13
 import javax.annotation.Resource;
17
-import java.util.Arrays;
18
 import java.util.List;
14
 import java.util.List;
19
 
15
 
20
 /**
16
 /**
36
 		// job group (executor)
32
 		// job group (executor)
37
 		List<XxlJobGroup> list = xxlJobGroupDao.findAll();
33
 		List<XxlJobGroup> list = xxlJobGroupDao.findAll();
38
 
34
 
39
-		if (CollectionUtils.isNotEmpty(list)) {
40
-			for (XxlJobGroup group: list) {
41
-				List<String> registryList = null;
42
-				if (group.getAddressType() == 0) {
43
-					registryList = JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
44
-				} else {
45
-					if (StringUtils.isNotBlank(group.getAddressList())) {
46
-						registryList = Arrays.asList(group.getAddressList().split(","));
47
-					}
48
-				}
49
-				group.setRegistryList(registryList);
50
-			}
51
-		}
52
-
53
 		model.addAttribute("list", list);
35
 		model.addAttribute("list", list);
54
 		return "jobgroup/jobgroup.index";
36
 		return "jobgroup/jobgroup.index";
55
 	}
37
 	}

+ 11 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java Просмотреть файл

1
 package com.xxl.job.admin.core.model;
1
 package com.xxl.job.admin.core.model;
2
 
2
 
3
+import org.apache.commons.lang.StringUtils;
4
+
5
+import java.util.ArrayList;
6
+import java.util.Arrays;
3
 import java.util.List;
7
 import java.util.List;
4
 
8
 
5
 /**
9
 /**
16
 
20
 
17
     // registry list
21
     // registry list
18
     private List<String> registryList;  // 执行器地址列表(系统注册)
22
     private List<String> registryList;  // 执行器地址列表(系统注册)
23
+    public List<String> getRegistryList() {
24
+        if (StringUtils.isNotBlank(addressList)) {
25
+            registryList = new ArrayList<String>(Arrays.asList(addressList.split(",")));
26
+        }
27
+        return registryList;
28
+    }
19
 
29
 
20
     public int getId() {
30
     public int getId() {
21
         return id;
31
         return id;
49
         this.order = order;
59
         this.order = order;
50
     }
60
     }
51
 
61
 
52
-    public List<String> getRegistryList() {
53
-        return registryList;
54
-    }
55
-
56
-    public void setRegistryList(List<String> registryList) {
57
-        this.registryList = registryList;
58
-    }
59
-
60
     public int getAddressType() {
62
     public int getAddressType() {
61
         return addressType;
63
         return addressType;
62
     }
64
     }
72
     public void setAddressList(String addressList) {
74
     public void setAddressList(String addressList) {
73
         this.addressList = addressList;
75
         this.addressList = addressList;
74
     }
76
     }
77
+
75
 }
78
 }

+ 36 - 28
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java Просмотреть файл

1
 package com.xxl.job.admin.core.thread;
1
 package com.xxl.job.admin.core.thread;
2
 
2
 
3
+import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobRegistry;
4
 import com.xxl.job.admin.core.model.XxlJobRegistry;
4
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5
 import com.xxl.job.core.enums.RegistryConfig;
6
 import com.xxl.job.core.enums.RegistryConfig;
7
+import org.apache.commons.collections.CollectionUtils;
8
+import org.apache.commons.lang.StringUtils;
6
 import org.slf4j.Logger;
9
 import org.slf4j.Logger;
7
 import org.slf4j.LoggerFactory;
10
 import org.slf4j.LoggerFactory;
8
 
11
 
9
 import java.util.ArrayList;
12
 import java.util.ArrayList;
13
+import java.util.HashMap;
10
 import java.util.List;
14
 import java.util.List;
11
-import java.util.concurrent.ConcurrentHashMap;
12
 import java.util.concurrent.TimeUnit;
15
 import java.util.concurrent.TimeUnit;
13
 
16
 
14
 /**
17
 /**
23
 		return instance;
26
 		return instance;
24
 	}
27
 	}
25
 
28
 
26
-	private ConcurrentHashMap<String, List<String>> registMap = new ConcurrentHashMap<String, List<String>>();
27
-
28
 	private Thread registryThread;
29
 	private Thread registryThread;
29
 	private boolean toStop = false;
30
 	private boolean toStop = false;
30
 	public void start(){
31
 	public void start(){
33
 			public void run() {
34
 			public void run() {
34
 				while (!toStop) {
35
 				while (!toStop) {
35
 					try {
36
 					try {
36
-                        // remove dead admin/executor
37
-						XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistryConfig.DEAD_TIMEOUT);
37
+						// auto registry group
38
+						List<XxlJobGroup> groupList = XxlJobDynamicScheduler.xxlJobGroupDao.findByAddressType(0);
39
+						if (CollectionUtils.isNotEmpty(groupList)) {
38
 
40
 
39
-                        // fresh registry map
40
-						ConcurrentHashMap<String, List<String>> temp = new ConcurrentHashMap<String, List<String>>();
41
-						List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
42
-						if (list != null) {
43
-							for (XxlJobRegistry item: list) {
44
-								String groupKey = makeGroupKey(item.getRegistryGroup(), item.getRegistryKey());
45
-								List<String> registryList = temp.get(groupKey);
46
-								if (registryList == null) {
47
-									registryList = new ArrayList<String>();
48
-								}
49
-								if (!registryList.contains(item.getRegistryValue())) {
50
-									registryList.add(item.getRegistryValue());
41
+							// remove dead address (admin/executor)
42
+							XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistryConfig.DEAD_TIMEOUT);
43
+
44
+							// fresh online address (admin/executor)
45
+							HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
46
+							List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
47
+							if (list != null) {
48
+								for (XxlJobRegistry item: list) {
49
+									if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
50
+										String appName = item.getRegistryKey();
51
+										List<String> registryList = appAddressMap.get(appName);
52
+										if (registryList == null) {
53
+											registryList = new ArrayList<String>();
54
+										}
55
+
56
+										if (!registryList.contains(item.getRegistryValue())) {
57
+											registryList.add(item.getRegistryValue());
58
+										}
59
+										appAddressMap.put(appName, registryList);
60
+									}
51
 								}
61
 								}
52
-								temp.put(groupKey, registryList);
62
+							}
63
+
64
+							// fresh group address
65
+							for (XxlJobGroup group: groupList) {
66
+								List<String> registryList = appAddressMap.get(group.getAppName());
67
+								String addressListStr = StringUtils.join(registryList, ",");
68
+
69
+								group.setAddressList(addressListStr);
70
+								XxlJobDynamicScheduler.xxlJobGroupDao.update(group);
53
 							}
71
 							}
54
 						}
72
 						}
55
-						registMap = temp;
56
 					} catch (Exception e) {
73
 					} catch (Exception e) {
57
 						logger.error("job registry instance error:{}", e);
74
 						logger.error("job registry instance error:{}", e);
58
 					}
75
 					}
73
 		//registryThread.interrupt();
90
 		//registryThread.interrupt();
74
 	}
91
 	}
75
 
92
 
76
-	private static String makeGroupKey(String registryGroup, String registryKey){
77
-		return registryGroup.concat("_").concat(registryKey);
78
-	}
79
-	
80
-	public static List<String> discover(String registryGroup, String registryKey){
81
-		String groupKey = makeGroupKey(registryGroup, registryKey);
82
-		return instance.registMap.get(groupKey);
83
-	}
84
-	
85
 }
93
 }

+ 3 - 14
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java Просмотреть файл

7
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
7
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
8
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
8
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
9
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
9
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
10
-import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
11
 import com.xxl.job.core.biz.model.ReturnT;
10
 import com.xxl.job.core.biz.model.ReturnT;
12
 import com.xxl.job.core.biz.model.TriggerParam;
11
 import com.xxl.job.core.biz.model.TriggerParam;
13
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
12
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
14
-import com.xxl.job.core.enums.RegistryConfig;
15
 import org.apache.commons.collections.CollectionUtils;
13
 import org.apache.commons.collections.CollectionUtils;
16
-import org.apache.commons.lang.StringUtils;
17
 import org.slf4j.Logger;
14
 import org.slf4j.Logger;
18
 import org.slf4j.LoggerFactory;
15
 import org.slf4j.LoggerFactory;
19
 
16
 
20
 import java.util.ArrayList;
17
 import java.util.ArrayList;
21
-import java.util.Arrays;
22
 import java.util.Date;
18
 import java.util.Date;
23
 
19
 
24
 /**
20
 /**
90
         StringBuffer triggerSb = new StringBuffer();
86
         StringBuffer triggerSb = new StringBuffer();
91
 
87
 
92
         // exerutor address list
88
         // exerutor address list
93
-        ArrayList<String> addressList = null;
94
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
89
         XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
95
-        if (group.getAddressType() == 0) {
96
-            triggerSb.append("注册方式:自动注册");
97
-            addressList = (ArrayList<String>) JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
98
-        } else {
99
-            triggerSb.append("注册方式:手动录入");
100
-            if (StringUtils.isNotBlank(group.getAddressList())) {
101
-                addressList = new ArrayList<String>(Arrays.asList(group.getAddressList().split(",")));
102
-            }
103
-        }
90
+        triggerSb.append( (group.getAddressType() == 0)?"注册方式:自动注册":"注册方式:手动录入" );
91
+        ArrayList<String> addressList = (ArrayList<String>) group.getRegistryList();
92
+
104
         triggerSb.append("<br>阻塞处理策略:").append(ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION).getTitle());
93
         triggerSb.append("<br>阻塞处理策略:").append(ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION).getTitle());
105
         triggerSb.append("<br>失败处理策略:").append(ExecutorFailStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorFailStrategyEnum.FAIL_ALARM).getTitle());
94
         triggerSb.append("<br>失败处理策略:").append(ExecutorFailStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorFailStrategyEnum.FAIL_ALARM).getTitle());
106
         triggerSb.append("<br>地址列表:").append(addressList!=null?addressList.toString():"");
95
         triggerSb.append("<br>地址列表:").append(addressList!=null?addressList.toString():"");

+ 2 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobGroupDao.java Просмотреть файл

11
 
11
 
12
     public List<XxlJobGroup> findAll();
12
     public List<XxlJobGroup> findAll();
13
 
13
 
14
+    public List<XxlJobGroup> findByAddressType(int addressType);
15
+
14
     public int save(XxlJobGroup xxlJobGroup);
16
     public int save(XxlJobGroup xxlJobGroup);
15
 
17
 
16
     public int update(XxlJobGroup xxlJobGroup);
18
     public int update(XxlJobGroup xxlJobGroup);

+ 5 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobGroupDaoImpl.java Просмотреть файл

23
     }
23
     }
24
 
24
 
25
     @Override
25
     @Override
26
+    public List<XxlJobGroup> findByAddressType(int addressType) {
27
+        return sqlSessionTemplate.selectList("XxlJobGroupMapper.findByAddressType", addressType);
28
+    }
29
+
30
+    @Override
26
     public int save(XxlJobGroup xxlJobGroup) {
31
     public int save(XxlJobGroup xxlJobGroup) {
27
         return sqlSessionTemplate.update("XxlJobGroupMapper.save", xxlJobGroup);
32
         return sqlSessionTemplate.update("XxlJobGroupMapper.save", xxlJobGroup);
28
     }
33
     }

+ 4 - 12
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Просмотреть файл

5
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
8
-import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
9
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
8
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
10
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
9
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
11
 import com.xxl.job.admin.dao.IXxlJobLogDao;
10
 import com.xxl.job.admin.dao.IXxlJobLogDao;
13
 import com.xxl.job.admin.service.IXxlJobService;
12
 import com.xxl.job.admin.service.IXxlJobService;
14
 import com.xxl.job.core.biz.model.ReturnT;
13
 import com.xxl.job.core.biz.model.ReturnT;
15
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
14
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
16
-import com.xxl.job.core.enums.RegistryConfig;
17
 import com.xxl.job.core.glue.GlueTypeEnum;
15
 import com.xxl.job.core.glue.GlueTypeEnum;
18
 import org.apache.commons.collections.CollectionUtils;
16
 import org.apache.commons.collections.CollectionUtils;
19
 import org.apache.commons.lang.StringUtils;
17
 import org.apache.commons.lang.StringUtils;
288
 		// executor count
286
 		// executor count
289
 		Set<String> executerAddressSet = new HashSet<String>();
287
 		Set<String> executerAddressSet = new HashSet<String>();
290
 		List<XxlJobGroup> groupList = xxlJobGroupDao.findAll();
288
 		List<XxlJobGroup> groupList = xxlJobGroupDao.findAll();
289
+
291
 		if (CollectionUtils.isNotEmpty(groupList)) {
290
 		if (CollectionUtils.isNotEmpty(groupList)) {
292
 			for (XxlJobGroup group: groupList) {
291
 			for (XxlJobGroup group: groupList) {
293
-				List<String> registryList = null;
294
-				if (group.getAddressType() == 0) {
295
-					registryList = JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
296
-				} else {
297
-					if (StringUtils.isNotBlank(group.getAddressList())) {
298
-						registryList = Arrays.asList(group.getAddressList().split(","));
299
-					}
300
-				}
301
-				if (CollectionUtils.isNotEmpty(registryList)) {
302
-					executerAddressSet.addAll(registryList);
292
+				if (CollectionUtils.isNotEmpty(group.getRegistryList())) {
293
+					executerAddressSet.addAll(group.getRegistryList());
303
 				}
294
 				}
304
 			}
295
 			}
305
 		}
296
 		}
297
+
306
 		int executorCount = executerAddressSet.size();
298
 		int executorCount = executerAddressSet.size();
307
 
299
 
308
 		Map<String, Object> dashboardMap = new HashMap<String, Object>();
300
 		Map<String, Object> dashboardMap = new HashMap<String, Object>();

+ 8 - 1
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml Просмотреть файл

21
 		t.address_list
21
 		t.address_list
22
 	</sql>
22
 	</sql>
23
 
23
 
24
-	<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
24
+	<select id="findAll" resultMap="XxlJobGroup">
25
 		SELECT <include refid="Base_Column_List" />
25
 		SELECT <include refid="Base_Column_List" />
26
 		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
26
 		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
27
 		ORDER BY t.order ASC
27
 		ORDER BY t.order ASC
28
 	</select>
28
 	</select>
29
 
29
 
30
+	<select id="findByAddressType" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
31
+		SELECT <include refid="Base_Column_List" />
32
+		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
33
+		WHERE t.address_type = #{addressType}
34
+		ORDER BY t.order ASC
35
+	</select>
36
+
30
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobGroup" >
37
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobGroup" >
31
 		INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `app_name`, `title`, `order`, `address_type`, `address_list`)
38
 		INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `app_name`, `title`, `order`, `address_type`, `address_list`)
32
 		values ( #{appName}, #{title}, #{order}, #{addressType}, #{addressList});
39
 		values ( #{appName}, #{title}, #{order}, #{addressType}, #{addressList});