Przeglądaj źródła

1、去除"任务名JobName"属性,"描述"改为"名称"属性,"任务名"改为"分组"属性;

xueli.xue 9 lat temu
rodzic
commit
c1cda137d5

+ 12 - 14
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java Wyświetl plik

1
 package com.xxl.job.admin.controller;
1
 package com.xxl.job.admin.controller;
2
 
2
 
3
-import java.util.Map;
4
-
5
-import javax.annotation.Resource;
6
-
3
+import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
4
+import com.xxl.job.admin.core.model.ReturnT;
5
+import com.xxl.job.admin.service.IXxlJobService;
7
 import org.springframework.stereotype.Controller;
6
 import org.springframework.stereotype.Controller;
8
 import org.springframework.ui.Model;
7
 import org.springframework.ui.Model;
9
 import org.springframework.web.bind.annotation.RequestMapping;
8
 import org.springframework.web.bind.annotation.RequestMapping;
10
 import org.springframework.web.bind.annotation.RequestParam;
9
 import org.springframework.web.bind.annotation.RequestParam;
11
 import org.springframework.web.bind.annotation.ResponseBody;
10
 import org.springframework.web.bind.annotation.ResponseBody;
12
 
11
 
13
-import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
14
-import com.xxl.job.admin.core.model.ReturnT;
15
-import com.xxl.job.admin.service.IXxlJobService;
12
+import javax.annotation.Resource;
13
+import java.util.Map;
16
 
14
 
17
 /**
15
 /**
18
  * index controller
16
  * index controller
43
 	@RequestMapping("/add")
41
 	@RequestMapping("/add")
44
 	@ResponseBody
42
 	@ResponseBody
45
 	public ReturnT<String> add(String jobGroup, String jobName, String jobCron, String jobDesc,
43
 	public ReturnT<String> add(String jobGroup, String jobName, String jobCron, String jobDesc,
46
-			String executorAddress, String executorHandler, String executorParam, 
44
+			String executorAddress, String executorParam,
47
 			String author, String alarmEmail, int alarmThreshold, 
45
 			String author, String alarmEmail, int alarmThreshold, 
48
 			int glueSwitch, String glueSource, String glueRemark) {
46
 			int glueSwitch, String glueSource, String glueRemark) {
49
 		
47
 		
50
-		return xxlJobService.add(jobGroup, jobCron, jobDesc, executorAddress, executorHandler, executorParam,
48
+		return xxlJobService.add(jobGroup, jobCron, jobDesc, executorAddress, executorParam,
51
 				author, alarmEmail, alarmThreshold, glueSwitch, glueSource, glueRemark);
49
 				author, alarmEmail, alarmThreshold, glueSwitch, glueSource, glueRemark);
52
 	}
50
 	}
53
 	
51
 	
54
 	@RequestMapping("/reschedule")
52
 	@RequestMapping("/reschedule")
55
 	@ResponseBody
53
 	@ResponseBody
56
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
54
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
57
-			String executorAddress, String executorHandler, String executorParam, 
58
-			String author, String alarmEmail, int alarmThreshold, int glueSwitch) {
59
-		
60
-		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, executorAddress, executorHandler, executorParam, author,
61
-				alarmEmail, alarmThreshold, glueSwitch);
55
+			String executorAddress, String executorParam,
56
+			String author, String alarmEmail, int alarmThreshold) {
57
+
58
+		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, executorAddress, executorParam, author,
59
+				alarmEmail, alarmThreshold);
62
 	}
60
 	}
63
 	
61
 	
64
 	@RequestMapping("/remove")
62
 	@RequestMapping("/remove")

+ 16 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java Wyświetl plik

1
 package com.xxl.job.admin.controller;
1
 package com.xxl.job.admin.controller;
2
 
2
 
3
-import java.text.ParseException;
4
-import java.util.Date;
5
-import java.util.HashMap;
6
-import java.util.List;
7
-import java.util.Map;
8
-
9
-import javax.annotation.Resource;
10
-
11
-import org.apache.commons.lang.StringUtils;
12
-import org.apache.commons.lang.time.DateUtils;
13
-import org.springframework.stereotype.Controller;
14
-import org.springframework.ui.Model;
15
-import org.springframework.web.bind.annotation.RequestMapping;
16
-import org.springframework.web.bind.annotation.RequestParam;
17
-import org.springframework.web.bind.annotation.ResponseBody;
18
-
19
 import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
3
 import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
20
 import com.xxl.job.admin.core.model.ReturnT;
4
 import com.xxl.job.admin.core.model.ReturnT;
21
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
26
 import com.xxl.job.core.handler.HandlerRepository.HandlerParamEnum;
10
 import com.xxl.job.core.handler.HandlerRepository.HandlerParamEnum;
27
 import com.xxl.job.core.util.HttpUtil;
11
 import com.xxl.job.core.util.HttpUtil;
28
 import com.xxl.job.core.util.HttpUtil.RemoteCallBack;
12
 import com.xxl.job.core.util.HttpUtil.RemoteCallBack;
13
+import org.apache.commons.lang.StringUtils;
14
+import org.apache.commons.lang.time.DateUtils;
15
+import org.springframework.stereotype.Controller;
16
+import org.springframework.ui.Model;
17
+import org.springframework.web.bind.annotation.RequestMapping;
18
+import org.springframework.web.bind.annotation.RequestParam;
19
+import org.springframework.web.bind.annotation.ResponseBody;
20
+
21
+import javax.annotation.Resource;
22
+import java.text.ParseException;
23
+import java.util.Date;
24
+import java.util.HashMap;
25
+import java.util.List;
26
+import java.util.Map;
29
 
27
 
30
 /**
28
 /**
31
  * index controller
29
  * index controller
155
 		Map<String, String> reqMap = new HashMap<String, String>();
153
 		Map<String, String> reqMap = new HashMap<String, String>();
156
 		reqMap.put(HandlerParamEnum.TIMESTAMP.name(), String.valueOf(System.currentTimeMillis()));
154
 		reqMap.put(HandlerParamEnum.TIMESTAMP.name(), String.valueOf(System.currentTimeMillis()));
157
 		reqMap.put(HandlerParamEnum.ACTION.name(), ActionEnum.KILL.name());
155
 		reqMap.put(HandlerParamEnum.ACTION.name(), ActionEnum.KILL.name());
158
-		reqMap.put(HandlerParamEnum.GLUE_SWITCH.name(), String.valueOf(jobInfo.getGlueSwitch()));
159
-		reqMap.put(HandlerParamEnum.EXECUTOR_HANDLER.name(), log.getExecutorHandler());
160
 		reqMap.put(HandlerParamEnum.JOB_GROUP.name(), log.getJobGroup());
156
 		reqMap.put(HandlerParamEnum.JOB_GROUP.name(), log.getJobGroup());
161
 		reqMap.put(HandlerParamEnum.JOB_NAME.name(), log.getJobName());
157
 		reqMap.put(HandlerParamEnum.JOB_NAME.name(), log.getJobName());
162
-		
158
+		reqMap.put(HandlerParamEnum.GLUE_SWITCH.name(), String.valueOf(jobInfo.getGlueSwitch()));
159
+
163
 		RemoteCallBack callBack = HttpUtil.post(HttpUtil.addressToUrl(log.getExecutorAddress()), reqMap);
160
 		RemoteCallBack callBack = HttpUtil.post(HttpUtil.addressToUrl(log.getExecutorAddress()), reqMap);
164
 		if (HttpUtil.RemoteCallBack.SUCCESS.equals(callBack.getStatus())) {
161
 		if (HttpUtil.RemoteCallBack.SUCCESS.equals(callBack.getStatus())) {
165
 			log.setHandleStatus(HttpUtil.RemoteCallBack.FAIL);
162
 			log.setHandleStatus(HttpUtil.RemoteCallBack.FAIL);

+ 3 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Wyświetl plik

58
 		params.put(HandlerParamEnum.LOG_ADDRESS.name(), XxlJobLogCallbackServer.getTrigger_log_address());
58
 		params.put(HandlerParamEnum.LOG_ADDRESS.name(), XxlJobLogCallbackServer.getTrigger_log_address());
59
 		params.put(HandlerParamEnum.LOG_ID.name(), String.valueOf(jobLog.getId()));
59
 		params.put(HandlerParamEnum.LOG_ID.name(), String.valueOf(jobLog.getId()));
60
 
60
 
61
-		params.put(HandlerParamEnum.EXECUTOR_HANDLER.name(), jobInfo.getExecutorHandler());
61
+		params.put(HandlerParamEnum.JOB_GROUP.name(), jobInfo.getJobGroup());
62
+		params.put(HandlerParamEnum.JOB_NAME.name(), jobInfo.getJobName());
62
 		params.put(HandlerParamEnum.EXECUTOR_PARAMS.name(), jobInfo.getExecutorParam());
63
 		params.put(HandlerParamEnum.EXECUTOR_PARAMS.name(), jobInfo.getExecutorParam());
63
 
64
 
64
 		params.put(HandlerParamEnum.GLUE_SWITCH.name(), String.valueOf(jobInfo.getGlueSwitch()));
65
 		params.put(HandlerParamEnum.GLUE_SWITCH.name(), String.valueOf(jobInfo.getGlueSwitch()));
65
-		params.put(HandlerParamEnum.JOB_GROUP.name(), jobInfo.getJobGroup());
66
-		params.put(HandlerParamEnum.JOB_NAME.name(), jobInfo.getJobName());
67
 
66
 
68
 		// failover trigger
67
 		// failover trigger
69
 		RemoteCallBack callback = failoverTrigger(jobInfo.getExecutorAddress(), params, jobLog);
68
 		RemoteCallBack callback = failoverTrigger(jobInfo.getExecutorAddress(), params, jobLog);
86
 	
85
 	
87
 	/**
86
 	/**
88
 	 * failover for trigger remote address
87
 	 * failover for trigger remote address
89
-	 * @param addressArr
88
+	 * @param handler_address
90
 	 * @return
89
 	 * @return
91
 	 */
90
 	 */
92
 	public RemoteCallBack failoverTrigger(String handler_address, HashMap<String, String> handler_params, XxlJobLog jobLog){
91
 	public RemoteCallBack failoverTrigger(String handler_address, HashMap<String, String> handler_params, XxlJobLog jobLog){

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java Wyświetl plik

14
 	public Map<String, Object> pageList(int start, int length, String jobGroup, String jobDesc, String filterTime);
14
 	public Map<String, Object> pageList(int start, int length, String jobGroup, String jobDesc, String filterTime);
15
 	
15
 	
16
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
16
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
17
-			String executorAddress,	String executorHandler, String executorParam, 
17
+			String executorAddress,	String executorParam,
18
 			String author, String alarmEmail, int alarmThreshold,
18
 			String author, String alarmEmail, int alarmThreshold,
19
 			int glueSwitch, String glueSource, String glueRemark);
19
 			int glueSwitch, String glueSource, String glueRemark);
20
 	
20
 	
21
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
21
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
22
-			String handler_address, String handler_name, String handler_params, 
23
-			String author, String alarmEmail, int alarmThreshold, int glueSwitch);
22
+			String handler_address, String handler_params,
23
+			String author, String alarmEmail, int alarmThreshold);
24
 	
24
 	
25
 	public ReturnT<String> remove(String jobGroup, String jobName);
25
 	public ReturnT<String> remove(String jobGroup, String jobName);
26
 	
26
 	

+ 9 - 22
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Wyświetl plik

1
 package com.xxl.job.admin.service.impl;
1
 package com.xxl.job.admin.service.impl;
2
 
2
 
3
-import java.util.HashMap;
4
-import java.util.List;
5
-import java.util.Map;
6
-import java.util.UUID;
3
+import java.util.*;
7
 
4
 
8
 import javax.annotation.Resource;
5
 import javax.annotation.Resource;
9
 
6
 
10
 import org.apache.commons.lang.StringUtils;
7
 import org.apache.commons.lang.StringUtils;
8
+import org.apache.commons.lang.time.DateFormatUtils;
9
+import org.apache.commons.lang.time.FastDateFormat;
11
 import org.quartz.CronExpression;
10
 import org.quartz.CronExpression;
12
 import org.quartz.SchedulerException;
11
 import org.quartz.SchedulerException;
13
 import org.springframework.stereotype.Service;
12
 import org.springframework.stereotype.Service;
60
 
59
 
61
 	@Override
60
 	@Override
62
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
61
 	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
63
-			String executorAddress,	String executorHandler, String executorParam, 
62
+			String executorAddress,	String executorParam,
64
 			String author, String alarmEmail, int alarmThreshold,
63
 			String author, String alarmEmail, int alarmThreshold,
65
 			int glueSwitch, String glueSource, String glueRemark) {
64
 			int glueSwitch, String glueSource, String glueRemark) {
66
 		// valid
65
 		// valid
76
 		if (StringUtils.isBlank(executorAddress)) {
75
 		if (StringUtils.isBlank(executorAddress)) {
77
 			return new ReturnT<String>(500, "请输入“执行器地址”");
76
 			return new ReturnT<String>(500, "请输入“执行器地址”");
78
 		}
77
 		}
79
-		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
80
-			return new ReturnT<String>(500, "请输入“jobHandler”");
81
-		}
82
 		if (StringUtils.isBlank(author)) {
78
 		if (StringUtils.isBlank(author)) {
83
 			return new ReturnT<String>(500, "请输入“负责人”");
79
 			return new ReturnT<String>(500, "请输入“负责人”");
84
 		}
80
 		}
90
 		}
86
 		}
91
 
87
 
92
 		// generate jobName
88
 		// generate jobName
93
-		String jobName = UUID.randomUUID().toString();
89
+		String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
94
 		try {
90
 		try {
95
 			if (DynamicSchedulerUtil.checkExists(jobName, jobGroup)) {
91
 			if (DynamicSchedulerUtil.checkExists(jobName, jobGroup)) {
96
-				return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名");
92
+				return new ReturnT<String>(500, "系统繁忙,请稍后重试");
97
 			}
93
 			}
98
 		} catch (SchedulerException e1) {
94
 		} catch (SchedulerException e1) {
99
 			e1.printStackTrace();
95
 			e1.printStackTrace();
100
-			return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名");
96
+			return new ReturnT<String>(500, "系统繁忙,请稍后重试");
101
 		}
97
 		}
102
 
98
 
103
 		// Backup to the database
99
 		// Backup to the database
114
 		jobInfo.setGlueSource(glueSource);
110
 		jobInfo.setGlueSource(glueSource);
115
 		jobInfo.setGlueRemark(glueRemark);
111
 		jobInfo.setGlueRemark(glueRemark);
116
 		jobInfo.setExecutorAddress(executorAddress);
112
 		jobInfo.setExecutorAddress(executorAddress);
117
-		jobInfo.setExecutorHandler(executorHandler);
118
 		jobInfo.setExecutorParam(executorParam);
113
 		jobInfo.setExecutorParam(executorParam);
119
 		xxlJobInfoDao.save(jobInfo);
114
 		xxlJobInfoDao.save(jobInfo);
120
 
115
 
135
 
130
 
136
 	@Override
131
 	@Override
137
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
132
 	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
138
-			String executorAddress,	String executorHandler, String executorParam, 
139
-			String author, String alarmEmail, int alarmThreshold, int glueSwitch) {
133
+			String executorAddress, String executorParam,
134
+			String author, String alarmEmail, int alarmThreshold) {
140
 		
135
 		
141
 		// valid
136
 		// valid
142
 		if (JobGroupEnum.match(jobGroup) == null) {
137
 		if (JobGroupEnum.match(jobGroup) == null) {
154
 		if (StringUtils.isBlank(executorAddress)) {
149
 		if (StringUtils.isBlank(executorAddress)) {
155
 			return new ReturnT<String>(500, "请输入“执行器地址”");
150
 			return new ReturnT<String>(500, "请输入“执行器地址”");
156
 		}
151
 		}
157
-		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
158
-			return new ReturnT<String>(500, "请输入“jobHandler”");
159
-		}
160
 		if (StringUtils.isBlank(author)) {
152
 		if (StringUtils.isBlank(author)) {
161
 			return new ReturnT<String>(500, "请输入“负责人”");
153
 			return new ReturnT<String>(500, "请输入“负责人”");
162
 		}
154
 		}
163
 		if (StringUtils.isBlank(alarmEmail)) {
155
 		if (StringUtils.isBlank(alarmEmail)) {
164
 			return new ReturnT<String>(500, "请输入“报警邮件”");
156
 			return new ReturnT<String>(500, "请输入“报警邮件”");
165
 		}
157
 		}
166
-		if (alarmThreshold < 0) {
167
-			alarmThreshold = 0;
168
-		}
169
 		
158
 		
170
 		XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
159
 		XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
171
 		jobInfo.setJobDesc(jobDesc);
160
 		jobInfo.setJobDesc(jobDesc);
173
 		jobInfo.setAuthor(author);
162
 		jobInfo.setAuthor(author);
174
 		jobInfo.setAlarmEmail(alarmEmail);
163
 		jobInfo.setAlarmEmail(alarmEmail);
175
 		jobInfo.setAlarmThreshold(alarmThreshold);
164
 		jobInfo.setAlarmThreshold(alarmThreshold);
176
-		jobInfo.setGlueSwitch(glueSwitch);
177
 		jobInfo.setExecutorAddress(executorAddress);
165
 		jobInfo.setExecutorAddress(executorAddress);
178
-		jobInfo.setExecutorHandler(executorHandler);
179
 		jobInfo.setExecutorParam(executorParam);
166
 		jobInfo.setExecutorParam(executorParam);
180
 		
167
 		
181
 		try {
168
 		try {

+ 24 - 25
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl Wyświetl plik

73
 					                  	<th name="jobCron" >Cron</th>
73
 					                  	<th name="jobCron" >Cron</th>
74
 					                  	<th name="jobClass" >JobBean</th>
74
 					                  	<th name="jobClass" >JobBean</th>
75
 					                  	<th name="executorAddress" >执行器地址</th>
75
 					                  	<th name="executorAddress" >执行器地址</th>
76
-					                  	<th name="executorHandler" >JobHandler</th>
77
 					                  	<th name="executorParam" >任务参数</th>
76
 					                  	<th name="executorParam" >任务参数</th>
78
 					                  	<th name="addTime" >新增时间</th>
77
 					                  	<th name="addTime" >新增时间</th>
79
 					                  	<th name="updateTime" >更新时间</th>
78
 					                  	<th name="updateTime" >更新时间</th>
121
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
120
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
122
 					</div>
121
 					</div>
123
 					<div class="form-group">
122
 					<div class="form-group">
124
-                        <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
125
-                        <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
126
                         <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
123
                         <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
127
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
124
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
125
+                        <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
126
+                        <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
128
 					</div>
127
 					</div>
129
 					<div class="form-group">
128
 					<div class="form-group">
130
-						<label for="lastname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
131
-						<div class="col-sm-4"><input type="text" class="form-control" name="executorHandler" placeholder="请输入“jobHandler”" maxlength="50" ></div>
132
                         <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
129
                         <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
133
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
130
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
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="author" placeholder="请输入“负责人”" maxlength="50" ></div>
134
 					</div>
133
 					</div>
135
 					<div class="form-group">
134
 					<div class="form-group">
136
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
135
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
139
 						<div class="col-sm-4"><input type="text" class="form-control" name="alarmThreshold" placeholder="请输入“报警阈值”" maxlength="5" ></div>
138
 						<div class="col-sm-4"><input type="text" class="form-control" name="alarmThreshold" placeholder="请输入“报警阈值”" maxlength="5" ></div>
140
 					</div>
139
 					</div>
141
                     <div class="form-group">
140
                     <div class="form-group">
142
-                        <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
143
-                        <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
141
+                        <label for="firstname" class="col-sm-2 control-label">任务模式<font color="red">*</font></label>
142
+                        <div class="col-sm-4">
143
+                            <select class="form-control" name="glueSwitch" >
144
+                                <option value="0" >BEAN模式</option>
145
+                                <option value="1" >GLUE模式</option>
146
+                            </select>
147
+                        </div>
144
                     </div>
148
                     </div>
145
 					<div class="form-group">
149
 					<div class="form-group">
146
 						<div class="col-sm-offset-3 col-sm-6">
150
 						<div class="col-sm-offset-3 col-sm-6">
147
 							<button type="submit" class="btn btn-primary"  >保存</button>
151
 							<button type="submit" class="btn btn-primary"  >保存</button>
148
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
152
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
149
 						</div>
153
 						</div>
150
-						<div class="col-sm-3">
151
-							<div class="checkbox">
152
-		                        <label><input type="checkbox" class="ifGLUE" >开启GLUE模式<font color="black">*</font></label>
153
-		                        <input type="hidden" name="glueSwitch" value="0" >
154
-	                    	</div>
155
-						</div>
156
 					</div>
154
 					</div>
157
 
155
 
158
 <input type="hidden" name="glueRemark" value="GLUE代码初始化" >
156
 <input type="hidden" name="glueRemark" value="GLUE代码初始化" >
207
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
205
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
208
 					</div>
206
 					</div>
209
 					<div class="form-group">
207
 					<div class="form-group">
210
-						<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>
212
                         <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
208
                         <label for="lastname" class="col-sm-2 control-label">执行器地址<font color="red">*</font></label>
213
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
209
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorAddress" placeholder="请输入“执行器地址”,多个地址逗号分隔" maxlength="50" ></div>
210
+                        <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>
214
 					</div>
212
 					</div>
215
 					
213
 					
216
 					<div class="form-group">
214
 					<div class="form-group">
217
-						<label for="lastname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
218
-						<div class="col-sm-4"><input type="text" class="form-control" name="executorHandler" placeholder="请输入“jobHandler”" maxlength="50" ></div>
219
                         <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
215
                         <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
220
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
216
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
217
+                        <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
218
+                        <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
221
 					</div>
219
 					</div>
222
 					<div class="form-group">
220
 					<div class="form-group">
223
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
221
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
226
 						<div class="col-sm-4"><input type="text" class="form-control" name="alarmThreshold" placeholder="请输入“报警阈值”" maxlength="5" ></div>
224
 						<div class="col-sm-4"><input type="text" class="form-control" name="alarmThreshold" placeholder="请输入“报警阈值”" maxlength="5" ></div>
227
 					</div>
225
 					</div>
228
                     <div class="form-group">
226
                     <div class="form-group">
229
-                        <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
230
-                        <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
227
+                        <label for="firstname" class="col-sm-2 control-label">任务模式<font color="red">*</font></label>
228
+                        <div class="col-sm-4">
229
+                            <select class="form-control" name="glueSwitch" disabled >
230
+                                <option value="0" >BEAN模式</option>
231
+                                <option value="1" >GLUE模式</option>
232
+                            </select>
233
+                        </div>
234
+                        <label for="lastname" class="col-sm-2 control-label">JobKey</label>
235
+                        <div class="col-sm-4"><input type="text" class="form-control" name="jobKey" placeholder="请输入“jobHandler”" readonly ></div>
231
                     </div>
236
                     </div>
232
 					<div class="form-group">
237
 					<div class="form-group">
233
 						<div class="col-sm-offset-3 col-sm-6">
238
 						<div class="col-sm-offset-3 col-sm-6">
234
 							<button type="submit" class="btn btn-primary"  >保存</button>
239
 							<button type="submit" class="btn btn-primary"  >保存</button>
235
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
240
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
236
 						</div>
241
 						</div>
237
-						<div class="col-sm-3">
238
-							<div class="checkbox">
239
-		                        <label><input type="checkbox" class="ifGLUE" >开启GLUE模式<font color="black">*</font></label>
240
-		                        <input type="hidden" name="glueSwitch" value="0" >
241
-	                    	</div>
242
-						</div>
243
 					</div>
242
 					</div>
244
 				</form>
243
 				</form>
245
          	</div>
244
          	</div>

+ 30 - 47
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js Wyświetl plik

39
 	                { "data": 'jobCron', "visible" : true},
39
 	                { "data": 'jobCron', "visible" : true},
40
 	                { "data": 'jobClass', "visible" : false},
40
 	                { "data": 'jobClass', "visible" : false},
41
 	                { "data": 'executorAddress', "visible" : false},
41
 	                { "data": 'executorAddress', "visible" : false},
42
-	                { "data": 'executorHandler', "visible" : false},
43
 	                { "data": 'executorParam', "visible" : false},
42
 	                { "data": 'executorParam', "visible" : false},
44
 	                { 
43
 	                { 
45
 	                	"data": 'addTime', 
44
 	                	"data": 'addTime', 
100
 	                							' jobDesc="'+ row.jobDesc +'" '+
99
 	                							' jobDesc="'+ row.jobDesc +'" '+
101
 	                							' jobClass="'+ row.jobClass +'" '+
100
 	                							' jobClass="'+ row.jobClass +'" '+
102
 	                							' executorAddress="'+row.executorAddress +'" '+
101
 	                							' executorAddress="'+row.executorAddress +'" '+
103
-	                							' executorHandler="'+ row.executorHandler +'" '+
104
 	                							' executorParam="'+ row.executorParam +'" '+
102
 	                							' executorParam="'+ row.executorParam +'" '+
105
 	                							' author="'+ row.author +'" '+
103
 	                							' author="'+ row.author +'" '+
106
 	                							' alarmEmail="'+ row.alarmEmail +'" '+
104
 	                							' alarmEmail="'+ row.alarmEmail +'" '+
225
             executorAddress : {
223
             executorAddress : {
226
             	required : true
224
             	required : true
227
             },
225
             },
228
-            executorHandler : {
229
-            	required : true
230
-            },
231
             alarmEmail : {
226
             alarmEmail : {
232
             	required : true
227
             	required : true
233
             },
228
             },
249
             executorAddress : {
244
             executorAddress : {
250
             	required :"请输入“执行器地址”."
245
             	required :"请输入“执行器地址”."
251
             },
246
             },
252
-            executorHandler : {
253
-            	required : "请输入“JobHandler”."
254
-            },
255
             alarmEmail : {
247
             alarmEmail : {
256
             	required : "请输入“报警邮件”."
248
             	required : "请输入“报警邮件”."
257
             },
249
             },
296
 		$(".remote_panel").show();	// remote
288
 		$(".remote_panel").show();	// remote
297
 	});
289
 	});
298
 	
290
 	
299
-	// GLUE模式开启
300
-	$("#addModal .form .ifGLUE").click(function(){
301
-		var ifGLUE = $(this).is(':checked');
302
-		var $executorHandler = $("#addModal .form input[name='executorHandler']");
303
-		var $glueSwitch = $("#addModal .form input[name='glueSwitch']");
304
-		if (ifGLUE) {
305
-			$executorHandler.val("");
306
-			$executorHandler.attr("readonly","readonly");
307
-			$glueSwitch.val(1);
308
-		} else {
309
-			$executorHandler.removeAttr("readonly");
310
-			$glueSwitch.val(0);
311
-		}
312
-	});
313
-	$("#updateModal .form .ifGLUE").click(function(){
314
-		var ifGLUE = $(this).is(':checked');
315
-		var $executorHandler = $("#updateModal .form input[name='executorHandler']");
316
-		var $glueSwitch = $("#updateModal .form input[name='glueSwitch']");
317
-		if (ifGLUE) {
318
-			$executorHandler.val("");
319
-			$executorHandler.attr("readonly","readonly");
320
-			$glueSwitch.val(1);
321
-		} else {
322
-			$executorHandler.removeAttr("readonly");
323
-			$glueSwitch.val(0);
324
-		}
325
-	});
326
-	
327
 	// 更新
291
 	// 更新
328
 	$("#job_list").on('click', '.update',function() {
292
 	$("#job_list").on('click', '.update',function() {
329
 
293
 
330
 		// base data
294
 		// base data
331
-		$("#updateModal .form input[name='jobGroupTitle']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").attr("selected",true);
332
 		$("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup"));
295
 		$("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup"));
333
 		$("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName"));
296
 		$("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName"));
334
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
297
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
335
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
298
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
336
 		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
299
 		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
337
-		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
338
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
300
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
339
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
301
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
340
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
302
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
341
 		$("#updateModal .form input[name='alarmThreshold']").val($(this).parent('p').attr("alarmThreshold"));
303
 		$("#updateModal .form input[name='alarmThreshold']").val($(this).parent('p').attr("alarmThreshold"));
342
-		$("#updateModal .form input[name='glueSwitch']").val($(this).parent('p').attr("glueSwitch"));
304
+
305
+		// job group selected
306
+		$("#updateModal .form select[name='jobGroupTitle']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").attr("selected",true);
307
+
308
+		// job group selected
309
+		$("#updateModal .form select[name='glueSwitch']").find("option[value='" + $(this).parent('p').attr("glueSwitch") + "']").attr("selected",true);
310
+
311
+		// generate job key
312
+		$("#updateModal .form input[name='jobKey']").val( $(this).parent('p').attr("jobGroup") + "_" + $(this).parent('p').attr("jobName") );
343
 
313
 
344
 		// GLUE check
314
 		// GLUE check
345
 		var $glueSwitch = $("#updateModal .form input[name='glueSwitch']");
315
 		var $glueSwitch = $("#updateModal .form input[name='glueSwitch']");
370
 			executorAddress : {
340
 			executorAddress : {
371
 				required : true
341
 				required : true
372
 			},
342
 			},
373
-			executorHandler : {
374
-				required : true
375
-			},
376
 			alarmEmail : {
343
 			alarmEmail : {
377
 				required : true
344
 				required : true
378
 			},
345
 			},
394
 			executorAddress : {
361
 			executorAddress : {
395
 				required :"请输入“执行器地址”."
362
 				required :"请输入“执行器地址”."
396
 			},
363
 			},
397
-			executorHandler : {
398
-				required : "请输入“JobHandler”."
399
-			},
400
 			alarmEmail : {
364
 			alarmEmail : {
401
 				required : "请输入“报警邮件”."
365
 				required : "请输入“报警邮件”."
402
 			},
366
 			},
419
             element.parent('div').append(error);  
383
             element.parent('div').append(error);  
420
         },
384
         },
421
         submitHandler : function(form) {
385
         submitHandler : function(form) {
386
+
387
+			// post
422
     		$.post(base_url + "/jobinfo/reschedule", $("#updateModal .form").serialize(), function(data, status) {
388
     		$.post(base_url + "/jobinfo/reschedule", $("#updateModal .form").serialize(), function(data, status) {
423
     			if (data.code == "200") {
389
     			if (data.code == "200") {
424
     				ComAlert.show(1, "更新成功", function(){
390
     				ComAlert.show(1, "更新成功", function(){
437
 	$("#updateModal").on('hide.bs.modal', function () {
403
 	$("#updateModal").on('hide.bs.modal', function () {
438
 		$("#updateModal .form")[0].reset()
404
 		$("#updateModal .form")[0].reset()
439
 	});
405
 	});
440
-	
441
-	
406
+
407
+	// GLUE模式开启
408
+	/*
409
+	 $("#addModal .form .ifGLUE").click(function(){
410
+         var ifGLUE = $(this).is(':checked');
411
+         var $executorHandler = $("#addModal .form input[name='executorHandler']");
412
+         var $glueSwitch = $("#addModal .form input[name='glueSwitch']");
413
+         if (ifGLUE) {
414
+         $executorHandler.val("");
415
+         $executorHandler.attr("readonly","readonly");
416
+         $glueSwitch.val(1);
417
+         } else {
418
+         $executorHandler.removeAttr("readonly");
419
+         $glueSwitch.val(0);
420
+         }
421
+	 });
422
+	 */
423
+
442
 	/*
424
 	/*
443
 	// 新增-添加参数
425
 	// 新增-添加参数
444
 	$("#addModal .addParam").on('click', function () {
426
 	$("#addModal .addParam").on('click', function () {
454
 		});
436
 		});
455
 	});
437
 	});
456
 	*/
438
 	*/
439
+
457
 });
440
 });

+ 1 - 1
xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java Wyświetl plik

88
 		Map<String, Object> serviceBeanMap = XxlJobExecutor.applicationContext.getBeansWithAnnotation(JobHander.class);
88
 		Map<String, Object> serviceBeanMap = XxlJobExecutor.applicationContext.getBeansWithAnnotation(JobHander.class);
89
         if (serviceBeanMap!=null && serviceBeanMap.size()>0) {
89
         if (serviceBeanMap!=null && serviceBeanMap.size()>0) {
90
             for (Object serviceBean : serviceBeanMap.values()) {
90
             for (Object serviceBean : serviceBeanMap.values()) {
91
-                String jobName = serviceBean.getClass().getAnnotation(JobHander.class).name();
91
+                String jobName = serviceBean.getClass().getAnnotation(JobHander.class).value();
92
                 if (jobName!=null && jobName.trim().length()>0 && serviceBean instanceof IJobHandler) {
92
                 if (jobName!=null && jobName.trim().length()>0 && serviceBean instanceof IJobHandler) {
93
                 	IJobHandler handler = (IJobHandler) serviceBean;
93
                 	IJobHandler handler = (IJobHandler) serviceBean;
94
                 	HandlerRepository.regist(jobName, handler);
94
                 	HandlerRepository.regist(jobName, handler);

+ 48 - 62
xxl-job-core/src/main/java/com/xxl/job/core/handler/HandlerRepository.java Wyświetl plik

1
 package com.xxl.job.core.handler;
1
 package com.xxl.job.core.handler;
2
 
2
 
3
-import java.util.Date;
4
-import java.util.HashMap;
5
-import java.util.Map;
6
-import java.util.concurrent.ConcurrentHashMap;
7
-import java.util.concurrent.LinkedBlockingQueue;
8
-
9
-import org.slf4j.Logger;
10
-import org.slf4j.LoggerFactory;
11
-
12
 import com.xxl.job.core.handler.impl.GlueJobHandler;
3
 import com.xxl.job.core.handler.impl.GlueJobHandler;
13
 import com.xxl.job.core.log.XxlJobFileAppender;
4
 import com.xxl.job.core.log.XxlJobFileAppender;
14
 import com.xxl.job.core.util.HttpUtil;
5
 import com.xxl.job.core.util.HttpUtil;
15
 import com.xxl.job.core.util.HttpUtil.RemoteCallBack;
6
 import com.xxl.job.core.util.HttpUtil.RemoteCallBack;
16
 import com.xxl.job.core.util.JacksonUtil;
7
 import com.xxl.job.core.util.JacksonUtil;
8
+import org.slf4j.Logger;
9
+import org.slf4j.LoggerFactory;
10
+
11
+import java.util.Date;
12
+import java.util.HashMap;
13
+import java.util.Map;
14
+import java.util.concurrent.ConcurrentHashMap;
15
+import java.util.concurrent.LinkedBlockingQueue;
17
 
16
 
18
 /**
17
 /**
19
  * handler repository
18
  * handler repository
32
 		 */
31
 		 */
33
 		ACTION,
32
 		ACTION,
34
 		/**
33
 		/**
35
-		 * remote executor jobhandler
34
+		 * job group
35
+		 */
36
+		JOB_GROUP,
37
+		/**
38
+		 * job name
36
 		 */
39
 		 */
37
-		EXECUTOR_HANDLER,
40
+		JOB_NAME,
38
 		/**
41
 		/**
39
 		 * params of jobhandler
42
 		 * params of jobhandler
40
 		 */
43
 		 */
44
 		 */
47
 		 */
45
 		GLUE_SWITCH,
48
 		GLUE_SWITCH,
46
 		/**
49
 		/**
47
-		 * job group
48
-		 */
49
-		JOB_GROUP,
50
-		/**
51
-		 * job name
52
-		 */
53
-		JOB_NAME,
54
-		/**
55
 		 * address for callback log
50
 		 * address for callback log
56
 		 */
51
 		 */
57
 		LOG_ADDRESS,
52
 		LOG_ADDRESS,
99
 					
94
 					
100
 		// parse namespace
95
 		// parse namespace
101
 		if (namespace.equals(ActionEnum.RUN.name())) {
96
 		if (namespace.equals(ActionEnum.RUN.name())) {
102
-			// push data to queue
97
+
98
+			// generate jobKey
99
+			String job_group = _param.get(HandlerParamEnum.JOB_GROUP.name());
100
+			String job_name = _param.get(HandlerParamEnum.JOB_NAME.name());
101
+			if (job_group == null || job_group.trim().length()==0 || job_name == null || job_name.trim().length()==0) {
102
+				callback.setMsg("JOB_GROUP or JOB_NAME is null.");
103
+				return JacksonUtil.writeValueAsString(callback);
104
+			}
105
+			String jobKey = job_group.concat("_").concat(job_name);
106
+
107
+			// glue switch
103
 			String handler_glue_switch = _param.get(HandlerParamEnum.GLUE_SWITCH.name());
108
 			String handler_glue_switch = _param.get(HandlerParamEnum.GLUE_SWITCH.name());
104
-			HandlerThread handlerThread = null;
109
+			if (handler_glue_switch==null || handler_glue_switch.trim().length()==0){
110
+				callback.setMsg("GLUE_SWITCH is null.");
111
+				return JacksonUtil.writeValueAsString(callback);
112
+			}
113
+
114
+			HandlerThread handlerThread = handlerTreadMap.get(jobKey);;
105
 			if ("0".equals(handler_glue_switch)) {
115
 			if ("0".equals(handler_glue_switch)) {
106
 				// bean model
116
 				// bean model
107
-				String handler_name = _param.get(HandlerParamEnum.EXECUTOR_HANDLER.name());
108
-				if (handler_name == null || handler_name.trim().length()==0) {
109
-					callback.setMsg("bean model handler[HANDLER_NAME] not found.");
110
-					return JacksonUtil.writeValueAsString(callback);
111
-				}
112
-				handlerThread = handlerTreadMap.get(handler_name);
113
 				if (handlerThread == null) {
117
 				if (handlerThread == null) {
114
-					callback.setMsg("handler[" + handler_name + "] not found.");
118
+					callback.setMsg("handler for jobKey=[" + jobKey + "] not found.");
115
 					return JacksonUtil.writeValueAsString(callback);
119
 					return JacksonUtil.writeValueAsString(callback);
116
 				}
120
 				}
117
 			} else {
121
 			} else {
118
 				// glue
122
 				// glue
119
-				String job_group = _param.get(HandlerParamEnum.JOB_GROUP.name());
120
-				String job_name = _param.get(HandlerParamEnum.JOB_NAME.name());
121
-				if (job_group == null || job_group.trim().length()==0 || job_name == null || job_name.trim().length()==0) {
122
-					callback.setMsg("glue model handler[job group or name] is null.");
123
-					return JacksonUtil.writeValueAsString(callback);
124
-				}
125
-				String glueHandleName = "glue_".concat(job_group).concat("_").concat(job_name);
126
-				handlerThread = handlerTreadMap.get(glueHandleName);
127
 				if (handlerThread==null) {
123
 				if (handlerThread==null) {
128
-					HandlerRepository.regist(glueHandleName, new GlueJobHandler(job_group, job_name));
124
+					HandlerRepository.regist(jobKey, new GlueJobHandler(job_group, job_name));
129
 				}
125
 				}
130
-				handlerThread = handlerTreadMap.get(glueHandleName);
126
+				handlerThread = handlerTreadMap.get(jobKey);
131
 			}
127
 			}
132
-			
128
+
129
+			// push data to queue
133
 			handlerThread.pushData(_param);
130
 			handlerThread.pushData(_param);
134
 			callback.setStatus(RemoteCallBack.SUCCESS);
131
 			callback.setStatus(RemoteCallBack.SUCCESS);
135
 		} else if (namespace.equals(ActionEnum.LOG.name())) {
132
 		} else if (namespace.equals(ActionEnum.LOG.name())) {
154
 			callback.setStatus(RemoteCallBack.SUCCESS);
151
 			callback.setStatus(RemoteCallBack.SUCCESS);
155
 			callback.setMsg(logConteng);
152
 			callback.setMsg(logConteng);
156
 		} else if (namespace.equals(ActionEnum.KILL.name())) {
153
 		} else if (namespace.equals(ActionEnum.KILL.name())) {
157
-			// kill handlerThread, and create new one
158
-			String handler_glue_switch = _param.get(HandlerParamEnum.GLUE_SWITCH.name());
159
-			String handlerName = null;
160
-			if ("0".equals(handler_glue_switch)) {
161
-				String executor_handler = _param.get(HandlerParamEnum.EXECUTOR_HANDLER.name());
162
-				if (executor_handler==null) {
163
-					callback.setMsg("bean job , param[EXECUTOR_HANDLER] is null");
164
-					return JacksonUtil.writeValueAsString(callback);
165
-				}
166
-				handlerName = executor_handler;
167
-			} else {
168
-				// glue
169
-				String job_group = _param.get(HandlerParamEnum.JOB_GROUP.name());
170
-				String job_name = _param.get(HandlerParamEnum.JOB_NAME.name());
171
-				if (job_group==null || job_group.trim().length()==0 || job_name==null || job_name.trim().length()==0) {
172
-					callback.setMsg("glue job , param[JOB_GROUP or JOB_NAME] is null");
173
-					return JacksonUtil.writeValueAsString(callback);
174
-				}
175
-				handlerName = "glue_".concat(job_group).concat("_").concat(job_name);
154
+			// generate jobKey
155
+			String job_group = _param.get(HandlerParamEnum.JOB_GROUP.name());
156
+			String job_name = _param.get(HandlerParamEnum.JOB_NAME.name());
157
+			if (job_group == null || job_group.trim().length()==0 || job_name == null || job_name.trim().length()==0) {
158
+				callback.setMsg("JOB_GROUP or JOB_NAME is null.");
159
+				return JacksonUtil.writeValueAsString(callback);
176
 			}
160
 			}
177
-			
178
-			HandlerThread handlerThread = handlerTreadMap.get(handlerName);
161
+			String jobKey = job_group.concat("_").concat(job_name);
162
+
163
+			// kill handlerThread, and create new one
164
+			HandlerThread handlerThread = handlerTreadMap.get(jobKey);
179
 			if (handlerThread != null) {
165
 			if (handlerThread != null) {
180
 				IJobHandler handler = handlerThread.getHandler();
166
 				IJobHandler handler = handlerThread.getHandler();
181
 				handlerThread.toStop();
167
 				handlerThread.toStop();
182
 				handlerThread.interrupt();
168
 				handlerThread.interrupt();
183
-				regist(handlerName, handler);
169
+				regist(jobKey, handler);
184
 				callback.setStatus(RemoteCallBack.SUCCESS);
170
 				callback.setStatus(RemoteCallBack.SUCCESS);
185
 			} else {
171
 			} else {
186
-				callback.setMsg("job handler[" + handlerName + "] not found.");
172
+				callback.setMsg("handler for jobKey=[" + jobKey + "] not found.");
187
 			}
173
 			}
188
 				
174
 				
189
 		} else if (namespace.equals(ActionEnum.BEAT.name())) {
175
 		} else if (namespace.equals(ActionEnum.BEAT.name())) {

+ 1 - 1
xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHander.java Wyświetl plik

15
 @Inherited
15
 @Inherited
16
 public @interface JobHander {
16
 public @interface JobHander {
17
 
17
 
18
-    String name();
18
+    String value() default "";
19
     
19
     
20
 }
20
 }

+ 1 - 1
xxl-job-executor-example/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java Wyświetl plik

20
  * 
20
  * 
21
  * @author xuxueli 2015-12-19 19:43:36
21
  * @author xuxueli 2015-12-19 19:43:36
22
  */
22
  */
23
-@JobHander(name="demoJobHandler")
23
+@JobHander(value="defaults_201607192222270796")
24
 @Service
24
 @Service
25
 public class DemoJobHandler extends IJobHandler {
25
 public class DemoJobHandler extends IJobHandler {
26
 	private static transient Logger logger = LoggerFactory.getLogger(DemoJobHandler.class);
26
 	private static transient Logger logger = LoggerFactory.getLogger(DemoJobHandler.class);