Sfoglia il codice sorgente

接入执行器,自动注册

xueli.xue 8 anni fa
parent
commit
9c05c3a96f

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java Vedi File

53
 			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
53
 			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
54
 		
54
 		
55
 		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
55
 		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
56
-				executorAppname, executorAddress, executorHandler, executorParam,
56
+				executorAddress, executorHandler, executorParam,
57
 				glueSwitch, glueSource, glueRemark, childJobKey);
57
 				glueSwitch, glueSource, glueRemark, childJobKey);
58
 	}
58
 	}
59
 	
59
 	
64
 			int glueSwitch, String childJobKey) {
64
 			int glueSwitch, String childJobKey) {
65
 
65
 
66
 		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, author, alarmEmail,
66
 		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, author, alarmEmail,
67
-				executorAppname, executorAddress, executorHandler, executorParam, glueSwitch, childJobKey);
67
+				executorAddress, executorHandler, executorParam, glueSwitch, childJobKey);
68
 	}
68
 	}
69
 	
69
 	
70
 	@RequestMapping("/remove")
70
 	@RequestMapping("/remove")

+ 8 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Vedi File

1
 package com.xxl.job.admin.core.jobbean;
1
 package com.xxl.job.admin.core.jobbean;
2
 
2
 
3
 import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
3
 import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
4
+import com.xxl.job.admin.core.model.XxlJobGroup;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobLog;
6
 import com.xxl.job.admin.core.model.XxlJobLog;
6
 import com.xxl.job.admin.core.thread.JobMonitorHelper;
7
 import com.xxl.job.admin.core.thread.JobMonitorHelper;
67
 		// parse address
68
 		// parse address
68
 		List<String> addressList = new ArrayList<String>();
69
 		List<String> addressList = new ArrayList<String>();
69
 		String parseAddressMsg = null;
70
 		String parseAddressMsg = null;
70
-		if (StringUtils.isNotBlank(jobInfo.getExecutorAppname())) {
71
-			addressList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), jobInfo.getExecutorAppname());
72
-			parseAddressMsg = MessageFormat.format("Parse Address (Appname注册方式) <br>>>>[address list] : {0}<br><hr>", addressList);
73
-		} else {
71
+		if (StringUtils.isNotBlank(jobInfo.getExecutorAddress())) {
74
 			List<String> addressArr = Arrays.asList(jobInfo.getExecutorAddress().split(","));
72
 			List<String> addressArr = Arrays.asList(jobInfo.getExecutorAddress().split(","));
75
 			addressList.addAll(addressArr);
73
 			addressList.addAll(addressArr);
76
 			parseAddressMsg = MessageFormat.format("Parse Address (地址配置方式) <br>>>>[address list] : {0}<br><hr>", addressList);
74
 			parseAddressMsg = MessageFormat.format("Parse Address (地址配置方式) <br>>>>[address list] : {0}<br><hr>", addressList);
75
+		} else {
76
+			XxlJobGroup group = DynamicSchedulerUtil.xxlJobGroupDao.load(jobInfo.getJobGroup());
77
+			if (group!=null) {
78
+				addressList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
79
+			}
80
+			parseAddressMsg = MessageFormat.format("Parse Address (Appname注册方式) <br>>>>[address list] : {0}<br><hr>", addressList);
77
 		}
81
 		}
78
 
82
 
79
 		// failover trigger
83
 		// failover trigger

+ 0 - 9
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java Vedi File

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

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java Vedi File

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 executorAppname, String executorAddress,	String executorHandler, String executorParam,
17
+			String executorAddress,	String executorHandler, String executorParam,
18
 			int glueSwitch, String glueSource, String glueRemark, String childJobKey);
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 executorAppname, String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey);
21
+			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
 	

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

65
 
65
 
66
 	@Override
66
 	@Override
67
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
67
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
68
-			String executorAppname, String executorAddress,	String executorHandler, String executorParam,
68
+			String executorAddress,	String executorHandler, String executorParam,
69
 			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
69
 			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
70
 		// valid
70
 		// valid
71
 		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
71
 		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
84
 		if (StringUtils.isBlank(alarmEmail)) {
84
 		if (StringUtils.isBlank(alarmEmail)) {
85
 			return new ReturnT<String>(500, "请输入“报警邮件”");
85
 			return new ReturnT<String>(500, "请输入“报警邮件”");
86
 		}
86
 		}
87
-		if (StringUtils.isBlank(executorAppname) && StringUtils.isBlank(executorAddress)) {
88
-			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址”不可同时为空");
89
-		}
90
-		if (StringUtils.isNotBlank(executorAppname) && StringUtils.isNotBlank(executorAddress)) {
91
-			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址” 不可同时使用");
92
-		}
93
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
87
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
94
 			return new ReturnT<String>(500, "请输入“JobHandler”");
88
 			return new ReturnT<String>(500, "请输入“JobHandler”");
95
 		}
89
 		}
128
 		jobInfo.setJobDesc(jobDesc);
122
 		jobInfo.setJobDesc(jobDesc);
129
 		jobInfo.setAuthor(author);
123
 		jobInfo.setAuthor(author);
130
 		jobInfo.setAlarmEmail(alarmEmail);
124
 		jobInfo.setAlarmEmail(alarmEmail);
131
-		jobInfo.setExecutorAppname(executorAppname);
132
 		jobInfo.setExecutorAddress(executorAddress);
125
 		jobInfo.setExecutorAddress(executorAddress);
133
 		jobInfo.setExecutorHandler(executorHandler);
126
 		jobInfo.setExecutorHandler(executorHandler);
134
 		jobInfo.setExecutorParam(executorParam);
127
 		jobInfo.setExecutorParam(executorParam);
154
 
147
 
155
 	@Override
148
 	@Override
156
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
149
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
157
-			String executorAppname, String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
150
+			String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
158
 
151
 
159
 		// valid
152
 		// valid
160
 		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
153
 		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
176
 		if (StringUtils.isBlank(alarmEmail)) {
169
 		if (StringUtils.isBlank(alarmEmail)) {
177
 			return new ReturnT<String>(500, "请输入“报警邮件”");
170
 			return new ReturnT<String>(500, "请输入“报警邮件”");
178
 		}
171
 		}
179
-		if (StringUtils.isBlank(executorAppname) && StringUtils.isBlank(executorAddress)) {
180
-			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址”不可同时为空");
181
-		}
182
-		if (StringUtils.isNotBlank(executorAppname) && StringUtils.isNotBlank(executorAddress)) {
183
-			return new ReturnT<String>(500, "“执行器AppName”和“执行器地址” 不可同时使用");
184
-		}
185
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
172
 		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
186
 			return new ReturnT<String>(500, "请输入“JobHandler”");
173
 			return new ReturnT<String>(500, "请输入“JobHandler”");
187
 		}
174
 		}
207
 		jobInfo.setJobDesc(jobDesc);
194
 		jobInfo.setJobDesc(jobDesc);
208
 		jobInfo.setAuthor(author);
195
 		jobInfo.setAuthor(author);
209
 		jobInfo.setAlarmEmail(alarmEmail);
196
 		jobInfo.setAlarmEmail(alarmEmail);
210
-		jobInfo.setExecutorAppname(executorAppname);
211
 		jobInfo.setExecutorAddress(executorAddress);
197
 		jobInfo.setExecutorAddress(executorAddress);
212
 		jobInfo.setExecutorHandler(executorHandler);
198
 		jobInfo.setExecutorHandler(executorHandler);
213
 		jobInfo.setExecutorParam(executorParam);
199
 		jobInfo.setExecutorParam(executorParam);

+ 0 - 5
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Vedi File

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

+ 14 - 20
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl Vedi 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>
82
 					                  	<th name="executorAddress" >执行器地址</th>
81
 					                  	<th name="executorAddress" >执行器地址</th>
83
                                         <th name="executorHandler" >JobJandler</th>
82
                                         <th name="executorHandler" >JobJandler</th>
84
 					                  	<th name="executorParam" >任务参数</th>
83
 					                  	<th name="executorParam" >任务参数</th>
127
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
126
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
128
 					</div>
127
 					</div>
129
 					<div class="form-group">
128
 					<div class="form-group">
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>
129
+						<label for="lastname" class="col-sm-2 control-label">执行器地址<font color="black">*</font></label>
130
+						<div class="col-sm-4">
131
+                            <div class="input-group">
132
+                                <input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" readonly >
133
+                                <span class="input-group-addon"><b>AUTO</b>&nbsp;<input type="checkbox" class="addressAuto" checked="checked" ></span>
134
+                            </div>
135
+						</div>
138
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
136
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
139
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
137
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
140
 					</div>
138
 					</div>
166
 							<button type="submit" class="btn btn-primary"  >保存</button>
164
 							<button type="submit" class="btn btn-primary"  >保存</button>
167
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
165
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
168
 						</div>
166
 						</div>
169
-                        <div class="col-sm-offset-0 col-sm-3">
170
-                            启动注册&nbsp;<input type="checkbox" class="ifAppName" >
171
-                        </div>
172
 					</div>
167
 					</div>
173
 
168
 
174
 <input type="hidden" name="glueRemark" value="GLUE代码初始化" >
169
 <input type="hidden" name="glueRemark" value="GLUE代码初始化" >
215
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
210
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
216
 					</div>
211
 					</div>
217
 					<div class="form-group">
212
 					<div class="form-group">
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>
213
+						<label for="lastname" class="col-sm-2 control-label">执行器地址<font color="black">*</font></label>
214
+						<div class="col-sm-4">
215
+                            <div class="input-group">
216
+								<input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" >
217
+								<span class="input-group-addon"><b>AUTO</b>&nbsp;<input type="checkbox" class="addressAuto" checked="checked" ></span>
218
+                            </div>
219
+						</div>
226
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
220
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
227
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
221
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
228
 					</div>
222
 					</div>

+ 20 - 34
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js Vedi 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},
49
 	                { "data": 'executorAddress', "visible" : false},
48
 	                { "data": 'executorAddress', "visible" : false},
50
 					{
49
 					{
51
 						"data": 'executorHandler',
50
 						"data": 'executorHandler',
114
 									' jobDesc="'+ row.jobDesc +'" '+
113
 									' jobDesc="'+ row.jobDesc +'" '+
115
 									' author="'+ row.author +'" '+
114
 									' author="'+ row.author +'" '+
116
 									' alarmEmail="'+ row.alarmEmail +'" '+
115
 									' alarmEmail="'+ row.alarmEmail +'" '+
117
-									' executorAppname="'+row.executorAppname +'" '+
118
 									' executorAddress="'+row.executorAddress +'" '+
116
 									' executorAddress="'+row.executorAddress +'" '+
119
 									' executorHandler="'+row.executorHandler +'" '+
117
 									' executorHandler="'+row.executorHandler +'" '+
120
 									' executorParam="'+ row.executorParam +'" '+
118
 									' executorParam="'+ row.executorParam +'" '+
312
 		$(".remote_panel").show();	// remote
310
 		$(".remote_panel").show();	// remote
313
 
311
 
314
 		$("#addModal .form input[name='executorHandler']").removeAttr("readonly");
312
 		$("#addModal .form input[name='executorHandler']").removeAttr("readonly");
315
-
316
-		// 注册模式
317
-		$("#addModal .form .executorAddress").show();
318
-		$("#addModal .form .executorAppname").hide();
319
 	});
313
 	});
320
 
314
 
321
-	// 注册模式
322
-	$(".ifAppName").click(function(){
323
-		var ifAppName = $(this).is(':checked');
324
-
315
+	// Auto 注册模式
316
+	$(".addressAuto").click(function(){
317
+		var addressAuto = $(this).is(':checked');
325
 		var $executorAddress = $(this).parents("form").find("input[name='executorAddress']");
318
 		var $executorAddress = $(this).parents("form").find("input[name='executorAddress']");
326
-		var $executorAppname = $(this).parents("form").find("input[name='executorAppname']");
327
-		$($executorAddress).val("");
328
-		$($executorAppname).val("");
329
-
330
-		var $executorAddressDiv = $(this).parents("form").find(".executorAddress");
331
-		var $executorAppnameDiv = $(this).parents("form").find(".executorAppname");
332
-		if (ifAppName) {
333
-			$($executorAddressDiv).hide();
334
-			$($executorAppnameDiv).show();
319
+		if (addressAuto) {
320
+			$executorAddress.val("");
321
+			$executorAddress.attr("readonly","readonly");
335
 		} else {
322
 		} else {
336
-			$($executorAddressDiv).show();
337
-			$($executorAppnameDiv).hide();
323
+			$executorAddress.val("");
324
+			$executorAddress.removeAttr("readonly");
338
 		}
325
 		}
339
 	});
326
 	});
340
 
327
 
363
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
350
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
364
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
351
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
365
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
352
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
366
-		$("#updateModal .form input[name='executorAppname']").val($(this).parent('p').attr("executorAppname"));
367
 		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
353
 		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
368
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
354
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
369
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
355
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
370
         $("#updateModal .form input[name='childJobKey']").val($(this).parent('p').attr("childJobKey"));
356
         $("#updateModal .form input[name='childJobKey']").val($(this).parent('p').attr("childJobKey"));
371
 
357
 
358
+		// addressAuto
359
+		var executorAddress = $(this).parent('p').attr("executorAddress");
360
+		var $addressAuto = $("#updateModal .addressAuto");
361
+		var $executorAddress = $("#updateModal .form input[name='executorAddress']");
362
+		if (executorAddress) {
363
+			$addressAuto.attr("checked", false);
364
+			$executorAddress.removeAttr("readonly");
365
+		} else {
366
+			$addressAuto.attr("checked", true);
367
+			$executorAddress.attr("readonly","readonly");
368
+		}
369
+
372
 		// jobGroupTitle
370
 		// jobGroupTitle
373
 		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
371
 		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
374
 		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
372
 		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
375
 
373
 
376
-		// appname / address, switch
377
-		var $executorAppname = $(this).parent('p').attr("executorAppname");
378
-		if ($executorAppname) {
379
-			$("#updateModal .form .ifAppName").attr("checked", true);
380
-			$("#updateModal .form .executorAppname").show();
381
-			$("#updateModal .form .executorAddress").hide();
382
-		} else {
383
-			$("#updateModal .form .ifAppName").attr("checked", false);
384
-			$("#updateModal .form .executorAppname").hide();
385
-			$("#updateModal .form .executorAddress").show();
386
-		}
387
-
388
         // glueSwitch
374
         // glueSwitch
389
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
375
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
390
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);
376
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);