Преглед изворни кода

执行器新增"注册方式"和"机器地址"属性,支持手动录入机器地址;

xueli.xue пре 8 година
родитељ
комит
338d3b62a5

+ 6 - 6
README.md Прегледај датотеку

@@ -732,12 +732,12 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
732 732
 - 8、GLUE依赖注入逻辑优化,支持别名注入;
733 733
 
734 734
 #### 6.11 版本 V1.6.0 特性(CODING)
735
-- 1、通讯:hex 通讯调整为 http-rpc 模式
736
-- 2、线程模型统一;
737
-- 3、执行器支持手动设置执行地址列表,提供开关切换使用注册地址还是手动设置的地址
738
-- 4、执行器路由规则:第一个、循环、随机、顺序故障(默认)转移
739
-- 5、CleanCode,清理无效的历史参数
740
-- 6、规范系统配置数据,通过配置文件统一管理
735
+- 1、通讯方案升级,原基于HEX的通讯模型调整为基于HTTP的二进制RPC的通讯模型
736
+- 2、规范线程模型统一,统一线程销毁方案
737
+- 3、CleanCode,清理无效的历史参数
738
+- 4、规范系统配置数据,通过配置文件统一管理
739
+- 5、执行器支持手动设置执行地址列表,提供开关切换使用注册地址还是手动设置的地址
740
+- 6、执行器路由规则:第一个、循环、随机、顺序故障(默认)转移
741 741
 
742 742
 #### TODO LIST
743 743
 - 1、支持脚本JOB(源码或指定路径), 即shell/python/php等, 日志实时输出并支持在线监控;定制JobHandler实现;

+ 8 - 5
db/tables_xxl_job.sql Прегледај датотеку

@@ -201,14 +201,17 @@ CREATE TABLE XXL_JOB_QRTZ_TRIGGER_REGISTRY (
201 201
   PRIMARY KEY (`id`)
202 202
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
203 203
 
204
-CREATE TABLE XXL_JOB_QRTZ_TRIGGER_GROUP (
204
+CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_GROUP` (
205 205
   `id` int(11) NOT NULL AUTO_INCREMENT,
206
-  `app_name` varchar(64) NOT NULL,
207
-  `title` varchar(12) NOT NULL,
208
-  `order` tinyint(4) NOT NULL,
206
+  `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
207
+  `title` varchar(12) NOT NULL COMMENT '执行器名称',
208
+  `order` tinyint(4) NOT NULL DEFAULT '0' COMMENT '排序',
209
+  `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
210
+  `address_list` varchar(200) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔',
209 211
   PRIMARY KEY (`id`)
210 212
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
211
-INSERT INTO `XXL_JOB_QRTZ_TRIGGER_GROUP` VALUES ('1', 'xxl-job-executor-example', '示例执行器', '1');
213
+
214
+INSERT INTO `XXL_JOB_QRTZ_TRIGGER_GROUP` ( `app_name`, `title`, `order`, `address_type`, `address_list`) values ( 'xxl-job-executor-example', '示例执行器', '1', '0', null);
212 215
 
213 216
 commit;
214 217
 

+ 31 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java Прегледај датотеку

@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
14 14
 import org.springframework.web.bind.annotation.ResponseBody;
15 15
 
16 16
 import javax.annotation.Resource;
17
+import java.util.Arrays;
17 18
 import java.util.List;
18 19
 
19 20
 /**
@@ -40,7 +41,14 @@ public class JobGroupController {
40 41
 
41 42
 		if (CollectionUtils.isNotEmpty(list)) {
42 43
 			for (XxlJobGroup group: list) {
43
-				List<String> registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
44
+				List<String> registryList = null;
45
+				if (group.getAddressType() == 0) {
46
+					registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
47
+				} else {
48
+					if (StringUtils.isNotBlank(group.getAddressList())) {
49
+						registryList = Arrays.asList(group.getAddressList().split(","));
50
+					}
51
+				}
44 52
 				group.setRegistryList(registryList);
45 53
 			}
46 54
 		}
@@ -64,6 +72,17 @@ public class JobGroupController {
64 72
 		if (xxlJobGroup.getTitle()==null || StringUtils.isBlank(xxlJobGroup.getTitle())) {
65 73
 			return new ReturnT<String>(500, "请输入名称");
66 74
 		}
75
+		if (xxlJobGroup.getAddressType()!=0) {
76
+			if (StringUtils.isBlank(xxlJobGroup.getAddressList())) {
77
+				return new ReturnT<String>(500, "手动录入注册方式,机器地址不可为空");
78
+			}
79
+			String[] addresss = xxlJobGroup.getAddressList().split(",");
80
+			for (String item: addresss) {
81
+				if (StringUtils.isBlank(item)) {
82
+					return new ReturnT<String>(500, "机器地址非法");
83
+				}
84
+			}
85
+		}
67 86
 
68 87
 		int ret = xxlJobGroupDao.save(xxlJobGroup);
69 88
 		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
@@ -82,6 +101,17 @@ public class JobGroupController {
82 101
 		if (xxlJobGroup.getTitle()==null || StringUtils.isBlank(xxlJobGroup.getTitle())) {
83 102
 			return new ReturnT<String>(500, "请输入名称");
84 103
 		}
104
+		if (xxlJobGroup.getAddressType()!=0) {
105
+			if (StringUtils.isBlank(xxlJobGroup.getAddressList())) {
106
+				return new ReturnT<String>(500, "手动录入注册方式,机器地址不可为空");
107
+			}
108
+			String[] addresss = xxlJobGroup.getAddressList().split(",");
109
+			for (String item: addresss) {
110
+				if (StringUtils.isBlank(item)) {
111
+					return new ReturnT<String>(500, "机器地址非法");
112
+				}
113
+			}
114
+		}
85 115
 
86 116
 		int ret = xxlJobGroupDao.update(xxlJobGroup);
87 117
 		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;

+ 19 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java Прегледај датотеку

@@ -11,9 +11,11 @@ public class XxlJobGroup {
11 11
     private String appName;
12 12
     private String title;
13 13
     private int order;
14
+    private int addressType;    // 执行器地址类型:0=自动注册、1=手动录入
15
+    private String addressList;    // 执行器地址列表,多地址逗号分隔(手动录入)
14 16
 
15 17
     // registry list
16
-    private List<String> registryList;
18
+    private List<String> registryList;  // 执行器地址列表(系统注册)
17 19
 
18 20
     public int getId() {
19 21
         return id;
@@ -54,4 +56,20 @@ public class XxlJobGroup {
54 56
     public void setRegistryList(List<String> registryList) {
55 57
         this.registryList = registryList;
56 58
     }
59
+
60
+    public int getAddressType() {
61
+        return addressType;
62
+    }
63
+
64
+    public void setAddressType(int addressType) {
65
+        this.addressType = addressType;
66
+    }
67
+
68
+    public String getAddressList() {
69
+        return addressList;
70
+    }
71
+
72
+    public void setAddressList(String addressList) {
73
+        this.addressList = addressList;
74
+    }
57 75
 }

+ 3 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java Прегледај датотеку

@@ -39,9 +39,11 @@ public class JobRegistryHelper {
39 39
                             XxlJobDynamicScheduler.xxlJobRegistryDao.registrySave(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
40 40
                         }
41 41
 
42
+                        // remove dead admin/executor
43
+						XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistHelper.TIMEOUT*2);
44
+
42 45
                         // fresh registry map
43 46
 						ConcurrentHashMap<String, List<String>> temp = new ConcurrentHashMap<String, List<String>>();
44
-						XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistHelper.TIMEOUT*2);
45 47
 						List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistHelper.TIMEOUT*2);
46 48
 						if (list != null) {
47 49
 							for (XxlJobRegistry item: list) {

+ 10 - 4
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml Прегледај датотеку

@@ -8,13 +8,17 @@
8 8
 	    <result column="app_name" property="appName" />
9 9
 	    <result column="title" property="title" />
10 10
 	    <result column="order" property="order" />
11
+		<result column="address_type" property="addressType" />
12
+		<result column="address_list" property="addressList" />
11 13
 	</resultMap>
12 14
 
13 15
 	<sql id="Base_Column_List">
14 16
 		t.id,
15 17
 		t.app_name,
16 18
 		t.title,
17
-		t.order
19
+		t.order,
20
+		t.address_type,
21
+		t.address_list
18 22
 	</sql>
19 23
 
20 24
 	<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
@@ -24,15 +28,17 @@
24 28
 	</select>
25 29
 
26 30
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobGroup" >
27
-		INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `app_name`, `title`, `order`)
28
-		values ( #{appName}, #{title}, #{order});
31
+		INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `app_name`, `title`, `order`, `address_type`, `address_list`)
32
+		values ( #{appName}, #{title}, #{order}, #{addressType}, #{addressList});
29 33
 	</insert>
30 34
 
31 35
 	<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobGroup" >
32 36
 		UPDATE XXL_JOB_QRTZ_TRIGGER_GROUP
33 37
 		SET `app_name` = #{appName},
34 38
 			`title` = #{title},
35
-			`order` = #{order}
39
+			`order` = #{order},
40
+			`address_type` = #{addressType},
41
+			`address_list` = #{addressList}
36 42
 		WHERE id = #{id}
37 43
 	</update>
38 44
 

+ 38 - 6
xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl Прегледај датотеку

@@ -33,16 +33,17 @@
33 33
 							<h3 class="box-title">执行器列表</h3>&nbsp;&nbsp;
34 34
                             <button class="btn btn-info btn-xs pull-left2 add" >+新增执行器</button>
35 35
                             &nbsp;&nbsp;&nbsp;&nbsp;
36
-                            调度中心OnLine:<#if adminAddressList?exists><#list adminAddressList as item><span class="badge bg-green">${item}</span></#list></#if>
36
+                            调度中心OnLine机器:<#if adminAddressList?exists><#list adminAddressList as item><span class="badge bg-green">${item}</span></#list></#if>
37 37
 						</div>
38 38
 			            <div class="box-body">
39 39
 			              	<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
40 40
 				                <thead>
41 41
 					            	<tr>
42
-                                        <th name="id" >ID</th>
42
+                                        <#--<th name="id" >ID</th>-->
43
+                                        <th name="order" >排序</th>
43 44
                                         <th name="appName" >AppName</th>
44 45
                                         <th name="title" >名称</th>
45
-					                  	<th name="order" >排序</th>
46
+                                        <th name="addressType" >注册方式</th>
46 47
                                         <th name="registryList" >OnLine 机器</th>
47 48
                                         <th name="operate" >操作</th>
48 49
 					                </tr>
@@ -51,13 +52,20 @@
51 52
 								<#if list?exists && list?size gt 0>
52 53
 								<#list list as group>
53 54
 									<tr>
54
-                                        <td>${group.id}</td>
55
+                                        <#--<td>${group.id}</td>-->
56
+                                        <td>${group.order}</td>
55 57
                                         <td>${group.appName}</td>
56 58
                                         <td>${group.title}</td>
57
-                                        <td>${group.order}</td>
59
+                                        <td><#if group.addressType==0>自动注册<#else>手动录入</#if></td>
58 60
                                         <td><#if group.registryList?exists><#list group.registryList as item><span class="badge bg-green">${item}</span><br></#list></#if></td>
59 61
 										<td>
60
-                                            <button class="btn btn-warning btn-xs update" id="${group.id}" appName="${group.appName}" title="${group.title}" order="${group.order}" >编辑</button>
62
+                                            <button class="btn btn-warning btn-xs update"
63
+                                                    id="${group.id}"
64
+                                                    appName="${group.appName}"
65
+                                                    title="${group.title}"
66
+                                                    order="${group.order}"
67
+                                                    addressType="${group.addressType}"
68
+                                                    addressList="${group.addressList}" >编辑</button>
61 69
                                             <button class="btn btn-danger btn-xs remove" id="${group.id}" >删除</button>
62 70
 										</td>
63 71
 									</tr>
@@ -93,6 +101,18 @@
93 101
                             <label for="lastname" class="col-sm-2 control-label">排序<font color="red">*</font></label>
94 102
                             <div class="col-sm-10"><input type="text" class="form-control" name="order" placeholder="请输入“排序”" maxlength="50" ></div>
95 103
                         </div>
104
+                        <div class="form-group">
105
+                            <label for="lastname" class="col-sm-2 control-label">注册方式<font color="red">*</font></label>
106
+                            <div class="col-sm-10">
107
+                                <input type="radio" name="addressType" value="0" checked />自动注册
108
+                                &nbsp;&nbsp;&nbsp;&nbsp;
109
+                                <input type="radio" name="addressType" value="1" />手动录入
110
+                            </div>
111
+                        </div>
112
+                        <div class="form-group">
113
+                            <label for="lastname" class="col-sm-2 control-label">机器地址<font color="red">*</font></label>
114
+                            <div class="col-sm-10"><input type="text" class="form-control" name="addressList" placeholder="请输入执行器地址列表,多地址逗号分隔" maxlength="200" readonly="readonly" ></div>
115
+                        </div>
96 116
                         <hr>
97 117
                         <div class="form-group">
98 118
                             <div class="col-sm-offset-3 col-sm-6">
@@ -127,6 +147,18 @@
127 147
                             <label for="lastname" class="col-sm-2 control-label">排序<font color="red">*</font></label>
128 148
                             <div class="col-sm-10"><input type="text" class="form-control" name="order" placeholder="请输入“排序”" maxlength="50" ></div>
129 149
                         </div>
150
+                        <div class="form-group">
151
+                            <label for="lastname" class="col-sm-2 control-label">注册方式<font color="red">*</font></label>
152
+                            <div class="col-sm-10">
153
+                                <input type="radio" name="addressType" value="0" />自动注册
154
+                                &nbsp;&nbsp;&nbsp;&nbsp;
155
+                                <input type="radio" name="addressType" value="1" />手动录入
156
+                            </div>
157
+                        </div>
158
+                        <div class="form-group">
159
+                            <label for="lastname" class="col-sm-2 control-label">机器地址<font color="red">*</font></label>
160
+                            <div class="col-sm-10"><input type="text" class="form-control" name="addressList" placeholder="请输入执行器地址列表,多地址逗号分隔" maxlength="200" readonly="readonly" ></div>
161
+                        </div>
130 162
                         <hr>
131 163
                         <div class="form-group">
132 164
                             <div class="col-sm-offset-3 col-sm-6">

+ 21 - 0
xxl-job-admin/src/main/webapp/static/js/jobgroup.index.1.js Прегледај датотеку

@@ -107,12 +107,33 @@ $(function() {
107 107
 		$("#addModal .form .form-group").removeClass("has-error");
108 108
 	});
109 109
 
110
+	// 注册方式,切换
111
+	$("#addModal input[name=addressType], #updateModal input[name=addressType]").click(function(){
112
+		var addressType = $(this).val();
113
+		var $addressList = $(this).parents("form").find("input[name=addressList]");
114
+		if (addressType == 0) {
115
+			$addressList.val("");
116
+			$addressList.attr("readonly","readonly");
117
+		} else {
118
+			$addressList.removeAttr("readonly");
119
+		}
120
+	});
121
+
122
+	// update
110 123
 	$('.update').on('click', function(){
111 124
 		$("#updateModal .form input[name='id']").val($(this).attr("id"));
112 125
 		$("#updateModal .form input[name='appName']").val($(this).attr("appName"));
113 126
 		$("#updateModal .form input[name='title']").val($(this).attr("title"));
114 127
 		$("#updateModal .form input[name='order']").val($(this).attr("order"));
115 128
 
129
+		// 注册方式
130
+		var addressType = $(this).attr("addressType");
131
+		$("#updateModal .form input[name='addressType']").removeAttr('checked');
132
+		//$("#updateModal .form input[name='addressType'][value='"+ addressType +"']").attr('checked', 'true');
133
+		$("#updateModal .form input[name='addressType'][value='"+ addressType +"']").click();
134
+		// 机器地址
135
+		$("#updateModal .form input[name='addressList']").val($(this).attr("addressList"));
136
+
116 137
 		$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
117 138
 	});
118 139
 	var updateModalValidate = $("#updateModal .form").validate({

+ 3 - 3
xxl-job-core/src/main/java/com/xxl/job/core/util/IpUtil.java Прегледај датотеку

@@ -16,9 +16,9 @@ import java.util.regex.Pattern;
16 16
 public class IpUtil {
17 17
 	private static final Logger logger = LoggerFactory.getLogger(IpUtil.class);
18 18
 
19
-	public static final String ANYHOST = "0.0.0.0";
20
-	public static final String LOCALHOST = "127.0.0.1";
21
-	private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
19
+	private static final String ANYHOST = "0.0.0.0";
20
+	private static final String LOCALHOST = "127.0.0.1";
21
+	public static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
22 22
 
23 23
 	private static volatile InetAddress LOCAL_ADDRESS = null;
24 24