Bladeren bron

调度中心, 支持根据AppName自动发现执行器地址;

xueli.xue 8 jaren geleden
bovenliggende
commit
5c16e16d96

+ 35 - 15
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Bestand weergeven

@@ -3,8 +3,10 @@ package com.xxl.job.admin.core.jobbean;
3 3
 import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5 5
 import com.xxl.job.admin.core.model.XxlJobLog;
6
+import com.xxl.job.admin.core.model.XxlJobRegistry;
6 7
 import com.xxl.job.admin.core.thread.JobMonitorHelper;
7 8
 import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
9
+import com.xxl.job.core.registry.RegistHelper;
8 10
 import com.xxl.job.core.router.HandlerRouter.ActionRepository;
9 11
 import com.xxl.job.core.router.model.RequestModel;
10 12
 import com.xxl.job.core.router.model.ResponseModel;
@@ -18,10 +20,7 @@ import org.slf4j.LoggerFactory;
18 20
 import org.springframework.scheduling.quartz.QuartzJobBean;
19 21
 
20 22
 import java.text.MessageFormat;
21
-import java.util.Arrays;
22
-import java.util.Collections;
23
-import java.util.Date;
24
-import java.util.List;
23
+import java.util.*;
25 24
 
26 25
 /**
27 26
  * http job bean
@@ -57,8 +56,25 @@ public class RemoteHttpJobBean extends QuartzJobBean {
57 56
 		requestModel.setLogAddress(XxlJobLogCallbackServer.getTrigger_log_address());
58 57
 		requestModel.setLogId(jobLog.getId());
59 58
 
59
+		// parse address
60
+		List<String> addressList = new ArrayList<String>();
61
+		String parseAddressMsg = null;
62
+		if (StringUtils.isNotBlank(jobInfo.getExecutorAppname())) {
63
+			List<XxlJobRegistry> xxlJobRegistryList = DynamicSchedulerUtil.xxlJobRegistryDao.findRegistrys(RegistHelper.RegistType.EXECUTOR.name(), jobInfo.getExecutorAppname());
64
+			if (xxlJobRegistryList!=null && xxlJobRegistryList.size()>0) {
65
+				for (XxlJobRegistry item: xxlJobRegistryList) {
66
+					addressList.add(item.getRegistryValue());
67
+				}
68
+			}
69
+			parseAddressMsg = MessageFormat.format("Parse Address (Appname注册方式) <br>>>>[address list] : {0}<br><hr>", addressList.toArray());
70
+		} else {
71
+			List<String> addressArr = Arrays.asList(jobInfo.getExecutorAddress().split(","));
72
+			addressList.addAll(addressArr);
73
+			parseAddressMsg = MessageFormat.format("Parse Address (地址配置方式) <br>>>>[address list] : {0}<br><hr>", addressList.toArray());
74
+		}
75
+
60 76
 		// failover trigger
61
-		ResponseModel responseModel = failoverTrigger(jobInfo.getExecutorAddress(), requestModel, jobLog);
77
+		ResponseModel responseModel = failoverTrigger(addressList, requestModel, jobLog);
62 78
 		jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
63 79
 		jobLog.setExecutorParam(jobInfo.getExecutorParam());
64 80
 		logger.info(">>>>>>>>>>> xxl-job failoverTrigger response, jobId:{}, responseModel:{}", jobLog.getId(), responseModel.toString());
@@ -66,7 +82,7 @@ public class RemoteHttpJobBean extends QuartzJobBean {
66 82
 		// update trigger info
67 83
 		jobLog.setTriggerTime(new Date());
68 84
 		jobLog.setTriggerStatus(responseModel.getStatus());
69
-		jobLog.setTriggerMsg(responseModel.getMsg());
85
+		jobLog.setTriggerMsg(parseAddressMsg + responseModel.getMsg());
70 86
 		DynamicSchedulerUtil.xxlJobLogDao.updateTriggerInfo(jobLog);
71 87
 
72 88
 		// monitor triger
@@ -78,16 +94,14 @@ public class RemoteHttpJobBean extends QuartzJobBean {
78 94
 	
79 95
 	/**
80 96
 	 * failover for trigger remote address
81
-	 * @param handler_address
82 97
 	 * @return
83 98
 	 */
84
-	public ResponseModel failoverTrigger(String handler_address, RequestModel requestModel, XxlJobLog jobLog){
85
-		if (handler_address.split(",").length > 1) {
99
+	public ResponseModel failoverTrigger(List<String> addressList, RequestModel requestModel, XxlJobLog jobLog){
100
+		if (addressList.size() > 1) {
86 101
 			
87 102
 			// for ha
88
-			List<String> addressList = Arrays.asList(handler_address.split(","));
89 103
 			Collections.shuffle(addressList);
90
-			
104
+
91 105
 			// for failover
92 106
 			String failoverMessage = "";
93 107
 			for (String address : addressList) {
@@ -119,14 +133,20 @@ public class RemoteHttpJobBean extends QuartzJobBean {
119 133
 			result.setStatus(ResponseModel.FAIL);
120 134
 			result.setMsg(failoverMessage);
121 135
 			return result;
122
-		} else {
136
+		} else if (addressList.size() == 1) {
137
+			String address = addressList.get(0);
123 138
 			// store real address
124
-			jobLog.setExecutorAddress(handler_address);
139
+			jobLog.setExecutorAddress(address);
125 140
 
126
-			ResponseModel triggerCallback = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(handler_address), requestModel);
127
-			String failoverMessage = MessageFormat.format("Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>", handler_address, triggerCallback.getStatus(), triggerCallback.getMsg());
141
+			ResponseModel triggerCallback = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(address), requestModel);
142
+			String failoverMessage = MessageFormat.format("Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>", address, triggerCallback.getStatus(), triggerCallback.getMsg());
128 143
 			triggerCallback.setMsg(failoverMessage);
129 144
 			return triggerCallback;
145
+		} else {
146
+			ResponseModel result = new ResponseModel();
147
+			result.setStatus(ResponseModel.FAIL);
148
+			result.setMsg( "Trigger error, <br>>>>address list is null <br><hr>" );
149
+			return result;
130 150
 		}
131 151
 	}
132 152
 

+ 55 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java Bestand weergeven

@@ -0,0 +1,55 @@
1
+package com.xxl.job.admin.core.model;
2
+
3
+import java.util.Date;
4
+
5
+/**
6
+ * Created by xuxueli on 16/9/30.
7
+ */
8
+public class XxlJobRegistry {
9
+
10
+    private int id;
11
+    private String registryGroup;
12
+    private String registryKey;
13
+    private String registryValue;
14
+    private Date updateTime;
15
+
16
+    public int getId() {
17
+        return id;
18
+    }
19
+
20
+    public void setId(int id) {
21
+        this.id = id;
22
+    }
23
+
24
+    public String getRegistryGroup() {
25
+        return registryGroup;
26
+    }
27
+
28
+    public void setRegistryGroup(String registryGroup) {
29
+        this.registryGroup = registryGroup;
30
+    }
31
+
32
+    public String getRegistryKey() {
33
+        return registryKey;
34
+    }
35
+
36
+    public void setRegistryKey(String registryKey) {
37
+        this.registryKey = registryKey;
38
+    }
39
+
40
+    public String getRegistryValue() {
41
+        return registryValue;
42
+    }
43
+
44
+    public void setRegistryValue(String registryValue) {
45
+        this.registryValue = registryValue;
46
+    }
47
+
48
+    public Date getUpdateTime() {
49
+        return updateTime;
50
+    }
51
+
52
+    public void setUpdateTime(Date updateTime) {
53
+        this.updateTime = updateTime;
54
+    }
55
+}

+ 9 - 23
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/DynamicSchedulerUtil.java Bestand weergeven

@@ -1,26 +1,13 @@
1 1
 package com.xxl.job.admin.core.util;
2 2
 
3
-import java.util.ArrayList;
4
-import java.util.Date;
5
-import java.util.HashMap;
6
-import java.util.HashSet;
7
-import java.util.List;
8
-import java.util.Map;
9
-import java.util.Set;
10
-
3
+import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
11 4
 import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
12
-import org.quartz.CronScheduleBuilder;
13
-import org.quartz.CronTrigger;
14
-import org.quartz.Job;
15
-import org.quartz.JobBuilder;
16
-import org.quartz.JobDetail;
17
-import org.quartz.JobKey;
18
-import org.quartz.Scheduler;
19
-import org.quartz.SchedulerException;
20
-import org.quartz.Trigger;
5
+import com.xxl.job.admin.core.model.XxlJobInfo;
6
+import com.xxl.job.admin.dao.IXxlJobInfoDao;
7
+import com.xxl.job.admin.dao.IXxlJobLogDao;
8
+import com.xxl.job.admin.dao.IXxlJobRegistryDao;
9
+import org.quartz.*;
21 10
 import org.quartz.Trigger.TriggerState;
22
-import org.quartz.TriggerBuilder;
23
-import org.quartz.TriggerKey;
24 11
 import org.quartz.impl.matchers.GroupMatcher;
25 12
 import org.quartz.impl.triggers.CronTriggerImpl;
26 13
 import org.slf4j.Logger;
@@ -31,10 +18,7 @@ import org.springframework.context.ApplicationContext;
31 18
 import org.springframework.context.ApplicationContextAware;
32 19
 import org.springframework.util.Assert;
33 20
 
34
-import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
35
-import com.xxl.job.admin.core.model.XxlJobInfo;
36
-import com.xxl.job.admin.dao.IXxlJobInfoDao;
37
-import com.xxl.job.admin.dao.IXxlJobLogDao;
21
+import java.util.*;
38 22
 
39 23
 /**
40 24
  * base quartz scheduler util
@@ -77,11 +61,13 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
77 61
     // xxlJobLogDao、xxlJobInfoDao
78 62
     public static IXxlJobLogDao xxlJobLogDao;
79 63
     public static IXxlJobInfoDao xxlJobInfoDao;
64
+    public static IXxlJobRegistryDao xxlJobRegistryDao;
80 65
 
81 66
     @Override
82 67
 	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
83 68
 		DynamicSchedulerUtil.xxlJobLogDao = applicationContext.getBean(IXxlJobLogDao.class);
84 69
 		DynamicSchedulerUtil.xxlJobInfoDao = applicationContext.getBean(IXxlJobInfoDao.class);
70
+        DynamicSchedulerUtil.xxlJobRegistryDao = applicationContext.getBean(IXxlJobRegistryDao.class);
85 71
 	}
86 72
     
87 73
 	@Override

+ 12 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobRegistryDao.java Bestand weergeven

@@ -0,0 +1,12 @@
1
+package com.xxl.job.admin.dao;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobRegistry;
4
+
5
+import java.util.List;
6
+
7
+/**
8
+ * Created by xuxueli on 16/9/30.
9
+ */
10
+public interface IXxlJobRegistryDao {
11
+    List<XxlJobRegistry> findRegistrys(String registryGroup, String registryKey);
12
+}

+ 30 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobRegistryDaoImpl.java Bestand weergeven

@@ -0,0 +1,30 @@
1
+package com.xxl.job.admin.dao.impl;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobRegistry;
4
+import com.xxl.job.admin.dao.IXxlJobRegistryDao;
5
+import org.mybatis.spring.SqlSessionTemplate;
6
+import org.springframework.stereotype.Repository;
7
+
8
+import javax.annotation.Resource;
9
+import java.util.HashMap;
10
+import java.util.List;
11
+import java.util.Map;
12
+
13
+/**
14
+ * Created by xuxueli on 16/9/30.
15
+ */
16
+@Repository
17
+public class XxlJobRegistryDaoImpl implements IXxlJobRegistryDao {
18
+
19
+    @Resource
20
+    public SqlSessionTemplate sqlSessionTemplate;
21
+
22
+    @Override
23
+    public List<XxlJobRegistry> findRegistrys(String registryGroup, String registryKey) {
24
+        Map<String, String> params = new HashMap<String, String>();
25
+        params.put("registryGroup", registryGroup);
26
+        params.put("registryKey", registryKey);
27
+        return sqlSessionTemplate.selectList("XxlJobRegistryMapper.findRegistrys", params);
28
+    }
29
+
30
+}

+ 35 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml Bestand weergeven

@@ -0,0 +1,35 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
3
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4
+<mapper namespace="XxlJobRegistryMapper">
5
+	
6
+	<resultMap id="XxlJobRegistry" type="com.xxl.job.admin.core.model.XxlJobRegistry" >
7
+		<result column="id" property="id" />
8
+	    <result column="registry_group" property="registryGroup" />
9
+	    <result column="registry_key" property="registryKey" />
10
+	    <result column="registry_value" property="registryValue" />
11
+		<result column="update_time" property="updateTime" />
12
+	</resultMap>
13
+
14
+	<sql id="Base_Column_List">
15
+		t.id,
16
+		t.registry_group,
17
+		t.registry_key,
18
+		t.registry_value,
19
+		t.update_time
20
+	</sql>
21
+	
22
+	<select id="findRegistrys" parameterType="java.util.HashMap" resultMap="XxlJobRegistry">
23
+		SELECT <include refid="Base_Column_List" />
24
+		FROM XXL_JOB_QRTZ_TRIGGER_REGISTRY AS t
25
+		WHERE t.registry_group = #{registryGroup}
26
+			AND t.registry_key = #{registryKey}
27
+			AND t.update_time <![CDATA[ > ]]> DATE_ADD(NOW(),INTERVAL -30 SECOND)
28
+	</select>
29
+
30
+	<delete id="refresh" >
31
+		delete from XXL_JOB_QRTZ_TRIGGER_REGISTRY
32
+		WHERE update_time <![CDATA[ < ]]> DATE_ADD(NOW(),INTERVAL -30 SECOND)
33
+	</delete>
34
+	
35
+</mapper>