Browse Source

设计 "注册模式" 交互

xueli.xue 9 years ago
parent
commit
662e129afc

+ 7 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java View File

41
 	@RequestMapping("/add")
41
 	@RequestMapping("/add")
42
 	@ResponseBody
42
 	@ResponseBody
43
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
43
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
44
-			String executorAddress, String executorHandler, String executorParam, int glueSwitch, String glueSource, String glueRemark,
45
-			String childJobKey) {
44
+			String executorAppname, String executorAddress, String executorHandler, String executorParam,
45
+			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
46
 		
46
 		
47
 		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
47
 		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
48
-				executorAddress, executorHandler, executorParam, glueSwitch, glueSource, glueRemark, childJobKey);
48
+				executorAppname, executorAddress, executorHandler, executorParam,
49
+				glueSwitch, glueSource, glueRemark, childJobKey);
49
 	}
50
 	}
50
 	
51
 	
51
 	@RequestMapping("/reschedule")
52
 	@RequestMapping("/reschedule")
52
 	@ResponseBody
53
 	@ResponseBody
53
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
54
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
54
-			String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
55
+			String executorAppname, String executorAddress, String executorHandler, String executorParam,
56
+			int glueSwitch, String childJobKey) {
55
 
57
 
56
 		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, author, alarmEmail,
58
 		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, author, alarmEmail,
57
-				executorAddress, executorHandler, executorParam, glueSwitch, childJobKey);
59
+				executorAppname, executorAddress, executorHandler, executorParam, glueSwitch, childJobKey);
58
 	}
60
 	}
59
 	
61
 	
60
 	@RequestMapping("/remove")
62
 	@RequestMapping("/remove")

+ 10 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java View File

20
 	
20
 	
21
 	private String author;		// 负责人
21
 	private String author;		// 负责人
22
 	private String alarmEmail;	// 报警邮件
22
 	private String alarmEmail;	// 报警邮件
23
-	
23
+
24
+	private String executorAppname;	// 执行器对应的AppName
24
 	private String executorAddress;	// 执行器地址,有多个则逗号分隔
25
 	private String executorAddress;	// 执行器地址,有多个则逗号分隔
25
 	private String executorHandler;	// 执行器,任务Handler名称
26
 	private String executorHandler;	// 执行器,任务Handler名称
26
 	private String executorParam;	// 执行器,任务参数
27
 	private String executorParam;	// 执行器,任务参数
106
 		this.alarmEmail = alarmEmail;
107
 		this.alarmEmail = alarmEmail;
107
 	}
108
 	}
108
 
109
 
110
+	public String getExecutorAppname() {
111
+		return executorAppname;
112
+	}
113
+
114
+	public void setExecutorAppname(String executorAppname) {
115
+		this.executorAppname = executorAppname;
116
+	}
117
+
109
 	public String getExecutorAddress() {
118
 	public String getExecutorAddress() {
110
 		return executorAddress;
119
 		return executorAddress;
111
 	}
120
 	}

+ 5 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java View File

1
 package com.xxl.job.admin.service;
1
 package com.xxl.job.admin.service;
2
 
2
 
3
-import java.util.Map;
4
-
5
 import com.xxl.job.admin.core.model.ReturnT;
3
 import com.xxl.job.admin.core.model.ReturnT;
6
 
4
 
5
+import java.util.Map;
6
+
7
 /**
7
 /**
8
  * core job action for xxl-job
8
  * core job action for xxl-job
9
  * 
9
  * 
14
 	public Map<String, Object> pageList(int start, int length, String jobGroup, String executorHandler, String filterTime);
14
 	public Map<String, Object> pageList(int start, int length, String jobGroup, String executorHandler, String filterTime);
15
 	
15
 	
16
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
16
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
17
-			String executorAddress,	String executorHandler, String executorParam, int glueSwitch, String glueSource, String glueRemark,
18
-			String childJobKey);
17
+			String executorAppname, String executorAddress,	String executorHandler, String executorParam,
18
+			int glueSwitch, String glueSource, String glueRemark, String childJobKey);
19
 	
19
 	
20
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
20
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
21
-			String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey);
21
+			String executorAppname, String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey);
22
 	
22
 	
23
 	public ReturnT<String> remove(String jobGroup, String jobName);
23
 	public ReturnT<String> remove(String jobGroup, String jobName);
24
 	
24
 	

+ 16 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java View File

61
 	}
61
 	}
62
 
62
 
63
 	@Override
63
 	@Override
64
-	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
65
-			String executorAddress,	String executorHandler, String executorParam, int glueSwitch, String glueSource, String glueRemark,
66
-			String childJobKey) {
64
+	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
65
+			String executorAppname, String executorAddress,	String executorHandler, String executorParam,
66
+			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
67
 		// valid
67
 		// valid
68
 		if (JobGroupEnum.match(jobGroup) == null) {
68
 		if (JobGroupEnum.match(jobGroup) == null) {
69
 			return new ReturnT<String>(500, "请选择“任务组”");
69
 			return new ReturnT<String>(500, "请选择“任务组”");
80
 		if (StringUtils.isBlank(alarmEmail)) {
80
 		if (StringUtils.isBlank(alarmEmail)) {
81
 			return new ReturnT<String>(500, "请输入“报警邮件”");
81
 			return new ReturnT<String>(500, "请输入“报警邮件”");
82
 		}
82
 		}
83
-		if (StringUtils.isBlank(executorAddress)) {
84
-			return new ReturnT<String>(500, "请输入“执行器地址”");
83
+		if (StringUtils.isBlank(executorAppname) && StringUtils.isBlank(executorAddress)) {
84
+			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址”不可同时为空");
85
+		}
86
+		if (StringUtils.isNotBlank(executorAppname) && StringUtils.isNotBlank(executorAddress)) {
87
+			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址” 不可同时使用");
85
 		}
88
 		}
86
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
89
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
87
 			return new ReturnT<String>(500, "请输入“JobHandler”");
90
 			return new ReturnT<String>(500, "请输入“JobHandler”");
121
 		jobInfo.setJobDesc(jobDesc);
124
 		jobInfo.setJobDesc(jobDesc);
122
 		jobInfo.setAuthor(author);
125
 		jobInfo.setAuthor(author);
123
 		jobInfo.setAlarmEmail(alarmEmail);
126
 		jobInfo.setAlarmEmail(alarmEmail);
127
+		jobInfo.setExecutorAppname(executorAppname);
124
 		jobInfo.setExecutorAddress(executorAddress);
128
 		jobInfo.setExecutorAddress(executorAddress);
125
 		jobInfo.setExecutorHandler(executorHandler);
129
 		jobInfo.setExecutorHandler(executorHandler);
126
 		jobInfo.setExecutorParam(executorParam);
130
 		jobInfo.setExecutorParam(executorParam);
146
 
150
 
147
 	@Override
151
 	@Override
148
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
152
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
149
-			String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
153
+			String executorAppname, String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
150
 
154
 
151
 		// valid
155
 		// valid
152
 		if (JobGroupEnum.match(jobGroup) == null) {
156
 		if (JobGroupEnum.match(jobGroup) == null) {
167
 		if (StringUtils.isBlank(alarmEmail)) {
171
 		if (StringUtils.isBlank(alarmEmail)) {
168
 			return new ReturnT<String>(500, "请输入“报警邮件”");
172
 			return new ReturnT<String>(500, "请输入“报警邮件”");
169
 		}
173
 		}
170
-		if (StringUtils.isBlank(executorAddress)) {
171
-			return new ReturnT<String>(500, "请输入“执行器地址”");
174
+		if (StringUtils.isBlank(executorAppname) && StringUtils.isBlank(executorAddress)) {
175
+			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址”不可同时为空");
176
+		}
177
+		if (StringUtils.isNotBlank(executorAppname) && StringUtils.isNotBlank(executorAddress)) {
178
+			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址” 不可同时使用");
172
 		}
179
 		}
173
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
180
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
174
 			return new ReturnT<String>(500, "请输入“JobHandler”");
181
 			return new ReturnT<String>(500, "请输入“JobHandler”");
195
 		jobInfo.setJobDesc(jobDesc);
202
 		jobInfo.setJobDesc(jobDesc);
196
 		jobInfo.setAuthor(author);
203
 		jobInfo.setAuthor(author);
197
 		jobInfo.setAlarmEmail(alarmEmail);
204
 		jobInfo.setAlarmEmail(alarmEmail);
205
+		jobInfo.setExecutorAppname(executorAppname);
198
 		jobInfo.setExecutorAddress(executorAddress);
206
 		jobInfo.setExecutorAddress(executorAddress);
199
 		jobInfo.setExecutorHandler(executorHandler);
207
 		jobInfo.setExecutorHandler(executorHandler);
200
 		jobInfo.setExecutorParam(executorParam);
208
 		jobInfo.setExecutorParam(executorParam);

+ 6 - 1
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml View File

16
 	    
16
 	    
17
 	    <result column="author" property="author" />
17
 	    <result column="author" property="author" />
18
 	    <result column="alarm_email" property="alarmEmail" />
18
 	    <result column="alarm_email" property="alarmEmail" />
19
-	    
19
+
20
+		<result column="executor_appname" property="executorAppname" />
20
 	    <result column="executor_address" property="executorAddress" />
21
 	    <result column="executor_address" property="executorAddress" />
21
 		<result column="executor_handler" property="executorHandler" />
22
 		<result column="executor_handler" property="executorHandler" />
22
 	    <result column="executor_param" property="executorParam" />
23
 	    <result column="executor_param" property="executorParam" />
38
 		t.update_time,
39
 		t.update_time,
39
 		t.author,
40
 		t.author,
40
 		t.alarm_email,
41
 		t.alarm_email,
42
+		t.executor_appname,
41
 		t.executor_address,
43
 		t.executor_address,
42
 		t.executor_handler,
44
 		t.executor_handler,
43
 		t.executor_param,
45
 		t.executor_param,
85
 			update_time,
87
 			update_time,
86
 			author,
88
 			author,
87
 			alarm_email,
89
 			alarm_email,
90
+			executor_appname,
88
 			executor_address,
91
 			executor_address,
89
 			executor_handler,
92
 			executor_handler,
90
 			executor_param,
93
 			executor_param,
101
 			NOW(),
104
 			NOW(),
102
 			#{author},
105
 			#{author},
103
 			#{alarmEmail},
106
 			#{alarmEmail},
107
+			#{executorAppname},
104
 			#{executorAddress},
108
 			#{executorAddress},
105
 			#{executorHandler},
109
 			#{executorHandler},
106
 			#{executorParam},
110
 			#{executorParam},
129
 			update_time = NOW(),
133
 			update_time = NOW(),
130
 			author = #{author},
134
 			author = #{author},
131
 			alarm_email = #{alarmEmail},
135
 			alarm_email = #{alarmEmail},
136
+			executor_appname = #{executorAppname},
132
 			executor_address = #{executorAddress},
137
 			executor_address = #{executorAddress},
133
 			executor_handler = #{executorHandler},
138
 			executor_handler = #{executorHandler},
134
 			executor_param = #{executorParam},
139
 			executor_param = #{executorParam},

+ 23 - 4
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl View File

78
                                         <th name="childJobKey" >任务Key</th>
78
                                         <th name="childJobKey" >任务Key</th>
79
 					                  	<th name="jobDesc" >描述</th>
79
 					                  	<th name="jobDesc" >描述</th>
80
 					                  	<th name="jobCron" >Cron</th>
80
 					                  	<th name="jobCron" >Cron</th>
81
+                                        <th name="executorAppname" >执行器Appname</th>
81
 					                  	<th name="executorAddress" >执行器地址</th>
82
 					                  	<th name="executorAddress" >执行器地址</th>
82
                                         <th name="executorHandler" >JobJandler</th>
83
                                         <th name="executorHandler" >JobJandler</th>
83
 					                  	<th name="executorParam" >任务参数</th>
84
 					                  	<th name="executorParam" >任务参数</th>
126
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
127
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
127
 					</div>
128
 					</div>
128
 					<div class="form-group">
129
 					<div class="form-group">
129
-                        <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
130
-                        <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
130
+						<div class="executorAddress">
131
+							<label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
132
+							<div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
133
+                        </div>
134
+						<div class="executorAppname" style="display:none;">
135
+							<label for="lastname" class="col-sm-2 control-label">AppName<font color="red">*</font></label>
136
+							<div class="col-sm-4"><input type="text" class="form-control" name="executorAppname" placeholder="请输入执行器对应Appname, 自动发现注册的人任务" maxlength="100" ></div>
137
+                        </div>
131
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
138
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
132
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
139
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
133
 					</div>
140
 					</div>
159
 							<button type="submit" class="btn btn-primary"  >保存</button>
166
 							<button type="submit" class="btn btn-primary"  >保存</button>
160
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
167
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
161
 						</div>
168
 						</div>
169
+                        <div class="col-sm-offset-0 col-sm-3">
170
+                            启动注册&nbsp;<input type="checkbox" class="ifAppName" >
171
+                        </div>
162
 					</div>
172
 					</div>
163
 
173
 
164
 <input type="hidden" name="glueRemark" value="GLUE代码初始化" >
174
 <input type="hidden" name="glueRemark" value="GLUE代码初始化" >
205
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
215
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
206
 					</div>
216
 					</div>
207
 					<div class="form-group">
217
 					<div class="form-group">
208
-                        <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
209
-                        <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
218
+                        <div class="executorAddress">
219
+                            <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
220
+                            <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
221
+                        </div>
222
+                        <div class="executorAppname" style="display:none;">
223
+                            <label for="lastname" class="col-sm-2 control-label">AppName<font color="red">*</font></label>
224
+                            <div class="col-sm-4"><input type="text" class="form-control" name="executorAppname" placeholder="请输入执行器对应Appname, 自动发现注册的人任务" maxlength="100" ></div>
225
+                        </div>
210
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
226
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
211
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
227
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
212
 					</div>
228
 					</div>
240
                             <input type="hidden" name="jobGroup" >
256
                             <input type="hidden" name="jobGroup" >
241
                             <input type="hidden" name="jobName" >
257
                             <input type="hidden" name="jobName" >
242
 						</div>
258
 						</div>
259
+                        <div class="col-sm-offset-0 col-sm-3">
260
+                            启动注册&nbsp;<input type="checkbox" class="ifAppName" >
261
+                        </div>
243
 					</div>
262
 					</div>
244
 				</form>
263
 				</form>
245
          	</div>
264
          	</div>

+ 36 - 1
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js View File

45
 					},
45
 					},
46
 	                { "data": 'jobDesc', "visible" : true},
46
 	                { "data": 'jobDesc', "visible" : true},
47
 	                { "data": 'jobCron', "visible" : true},
47
 	                { "data": 'jobCron', "visible" : true},
48
+					{ "data": 'executorAppname', "visible" : false},
48
 	                { "data": 'executorAddress', "visible" : false},
49
 	                { "data": 'executorAddress', "visible" : false},
49
 					{
50
 					{
50
 						"data": 'executorHandler',
51
 						"data": 'executorHandler',
113
 									' jobDesc="'+ row.jobDesc +'" '+
114
 									' jobDesc="'+ row.jobDesc +'" '+
114
 									' author="'+ row.author +'" '+
115
 									' author="'+ row.author +'" '+
115
 									' alarmEmail="'+ row.alarmEmail +'" '+
116
 									' alarmEmail="'+ row.alarmEmail +'" '+
117
+									' executorAppname="'+row.executorAppname +'" '+
116
 									' executorAddress="'+row.executorAddress +'" '+
118
 									' executorAddress="'+row.executorAddress +'" '+
117
 									' executorHandler="'+row.executorHandler +'" '+
119
 									' executorHandler="'+row.executorHandler +'" '+
118
 									' executorParam="'+ row.executorParam +'" '+
120
 									' executorParam="'+ row.executorParam +'" '+
312
 		$("#addModal .form input[name='executorHandler']").removeAttr("readonly");
314
 		$("#addModal .form input[name='executorHandler']").removeAttr("readonly");
313
 	});
315
 	});
314
 
316
 
317
+	// 注册模式
318
+	$(".ifAppName").click(function(){
319
+		var ifAppName = $(this).is(':checked');
320
+
321
+		var $executorAddress = $(this).parents("form").find("input[name='executorAddress']");
322
+		var $executorAppname = $(this).parents("form").find("input[name='executorAppname']");
323
+		$($executorAddress).val("");
324
+		$($executorAppname).val("");
325
+
326
+		var $executorAddressDiv = $(this).parents("form").find(".executorAddress");
327
+		var $executorAppnameDiv = $(this).parents("form").find(".executorAppname");
328
+		if (ifAppName) {
329
+			$($executorAddressDiv).hide();
330
+			$($executorAppnameDiv).show();
331
+		} else {
332
+			$($executorAddressDiv).show();
333
+			$($executorAppnameDiv).hide();
334
+		}
335
+	});
336
+
315
 	// GLUE模式开启
337
 	// GLUE模式开启
316
 	$(".ifGLUE").click(function(){
338
 	$(".ifGLUE").click(function(){
317
 		var ifGLUE = $(this).is(':checked');
339
 		var ifGLUE = $(this).is(':checked');
337
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
359
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
338
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
360
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
339
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
361
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
362
+		$("#updateModal .form input[name='executorAppname']").val($(this).parent('p').attr("executorAppname"));
340
 		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
363
 		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
341
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
364
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
342
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
365
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
346
 		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
369
 		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
347
 		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
370
 		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
348
 
371
 
372
+		// appname / address, switch
373
+		var $executorAppname = $(this).parent('p').attr("executorAppname");
374
+		if ($executorAppname) {
375
+			$("#updateModal .form .ifAppName").attr("checked", true);
376
+			$("#updateModal .form .executorAppname").show();
377
+			$("#updateModal .form .executorAddress").hide();
378
+		} else {
379
+			$("#updateModal .form .ifAppName").attr("checked", false);
380
+			$("#updateModal .form .executorAppname").hide();
381
+			$("#updateModal .form .executorAddress").show();
382
+		}
383
+
349
         // glueSwitch
384
         // glueSwitch
350
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
385
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
351
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);
386
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);
377
 				required : true
412
 				required : true
378
 			},
413
 			},
379
 			executorAddress : {
414
 			executorAddress : {
380
-				required : true
415
+				required : false
381
 			},
416
 			},
382
 			executorHandler : {
417
 			executorHandler : {
383
 				required : false
418
 				required : false