xueli.xue 9 年前
父节点
当前提交
1e0ba18606

+ 2 - 0
db/tables_xxl_job.sql 查看文件

156
   `author` varchar(64) DEFAULT NULL COMMENT '作者',
156
   `author` varchar(64) DEFAULT NULL COMMENT '作者',
157
   `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
157
   `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
158
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,有多个则逗号分隔',
158
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,有多个则逗号分隔',
159
+  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
159
   `executor_param` varchar(255) DEFAULT NULL COMMENT '执行器任务参数',
160
   `executor_param` varchar(255) DEFAULT NULL COMMENT '执行器任务参数',
160
   `glue_switch` int(11) DEFAULT '0' COMMENT 'GLUE模式开关:0-否,1-是',
161
   `glue_switch` int(11) DEFAULT '0' COMMENT 'GLUE模式开关:0-否,1-是',
161
   `glue_source` text COMMENT 'GLUE源代码',
162
   `glue_source` text COMMENT 'GLUE源代码',
169
   `job_group` varchar(255) NOT NULL COMMENT '任务组',
170
   `job_group` varchar(255) NOT NULL COMMENT '任务组',
170
   `job_name` varchar(255) NOT NULL COMMENT '任务名',
171
   `job_name` varchar(255) NOT NULL COMMENT '任务名',
171
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
172
   `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
173
+  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
172
   `executor_param` varchar(255) DEFAULT NULL COMMENT 'executor_param',
174
   `executor_param` varchar(255) DEFAULT NULL COMMENT 'executor_param',
173
   `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
175
   `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
174
   `trigger_status` varchar(255) DEFAULT NULL COMMENT '调度-结果',
176
   `trigger_status` varchar(255) DEFAULT NULL COMMENT '调度-结果',

+ 10 - 10
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java 查看文件

33
 	@ResponseBody
33
 	@ResponseBody
34
 	public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,  
34
 	public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,  
35
 			@RequestParam(required = false, defaultValue = "10") int length,
35
 			@RequestParam(required = false, defaultValue = "10") int length,
36
-			String jobGroup, String jobDesc, String filterTime) {
36
+			String jobGroup, String executorHandler, String filterTime) {
37
 		
37
 		
38
-		return xxlJobService.pageList(start, length, jobGroup, jobDesc, filterTime);
38
+		return xxlJobService.pageList(start, length, jobGroup, executorHandler, filterTime);
39
 	}
39
 	}
40
 	
40
 	
41
 	@RequestMapping("/add")
41
 	@RequestMapping("/add")
42
 	@ResponseBody
42
 	@ResponseBody
43
-	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
44
-			String executorAddress, String executorParam, String author, String alarmEmail,
45
-			int glueSwitch, String glueSource, String glueRemark) {
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) {
46
 		
45
 		
47
-		return xxlJobService.add(jobGroup, jobCron, jobDesc, executorAddress, executorParam,
48
-				author, alarmEmail, glueSwitch, glueSource, glueRemark);
46
+		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
47
+				executorAddress, executorHandler, executorParam, glueSwitch, glueSource, glueRemark);
49
 	}
48
 	}
50
 	
49
 	
51
 	@RequestMapping("/reschedule")
50
 	@RequestMapping("/reschedule")
52
 	@ResponseBody
51
 	@ResponseBody
53
-	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
54
-			String executorAddress, String executorParam, String author, String alarmEmail) {
52
+	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
53
+			String executorAddress, String executorHandler, String executorParam, int glueSwitch) {
55
 
54
 
56
-		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, executorAddress, executorParam, author, alarmEmail);
55
+		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, author, alarmEmail,
56
+				executorAddress, executorHandler, executorParam, glueSwitch);
57
 	}
57
 	}
58
 	
58
 	
59
 	@RequestMapping("/remove")
59
 	@RequestMapping("/remove")

+ 9 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java 查看文件

22
 	private String alarmEmail;	// 报警邮件
22
 	private String alarmEmail;	// 报警邮件
23
 	
23
 	
24
 	private String executorAddress;	// 执行器地址,有多个则逗号分隔
24
 	private String executorAddress;	// 执行器地址,有多个则逗号分隔
25
+	private String executorHandler;	// 执行器,任务Handler名称
25
 	private String executorParam;	// 执行器,任务参数
26
 	private String executorParam;	// 执行器,任务参数
26
 	
27
 	
27
 	private int glueSwitch;		// GLUE模式开关:0-否,1-是
28
 	private int glueSwitch;		// GLUE模式开关:0-否,1-是
31
 	// copy from quartz
32
 	// copy from quartz
32
 	private String jobStatus;	// 任务状态 【base on quartz】
33
 	private String jobStatus;	// 任务状态 【base on quartz】
33
 
34
 
34
-	// generate job key
35
-	private String jobKey;
36
-
37
 	public int getId() {
35
 	public int getId() {
38
 		return id;
36
 		return id;
39
 	}
37
 	}
114
 		this.executorAddress = executorAddress;
112
 		this.executorAddress = executorAddress;
115
 	}
113
 	}
116
 
114
 
115
+	public String getExecutorHandler() {
116
+		return executorHandler;
117
+	}
118
+
119
+	public void setExecutorHandler(String executorHandler) {
120
+		this.executorHandler = executorHandler;
121
+	}
122
+
117
 	public String getExecutorParam() {
123
 	public String getExecutorParam() {
118
 		return executorParam;
124
 		return executorParam;
119
 	}
125
 	}
154
 		this.jobStatus = jobStatus;
160
 		this.jobStatus = jobStatus;
155
 	}
161
 	}
156
 
162
 
157
-	public String getJobKey() {
158
-		return jobGroup.concat("_").concat(jobName);
159
-	}
160
-
161
-	public void setJobKey(String jobKey) {
162
-		this.jobKey = jobKey;
163
-	}
164
-
165
 }
163
 }

+ 25 - 26
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobMonitorHelper.java 查看文件

30
 			@Override
30
 			@Override
31
 			public void run() {
31
 			public void run() {
32
 				while (true) {
32
 				while (true) {
33
-					logger.info(">>>>>>>>>>> job monitor run ... ");
34
-					Integer jobLogId = JobMonitorHelper.helper.queue.poll();
35
-					if (jobLogId != null && jobLogId > 0) {
36
-						XxlJobLog log = DynamicSchedulerUtil.xxlJobLogDao.load(jobLogId);
37
-						if (log!=null) {
38
-							if (RemoteCallBack.SUCCESS.equals(log.getTriggerStatus()) && StringUtils.isBlank(log.getHandleStatus())) {
39
-								try {
40
-									TimeUnit.SECONDS.sleep(10);
41
-								} catch (InterruptedException e) {
42
-									e.printStackTrace();
33
+					try {
34
+						logger.info(">>>>>>>>>>> job monitor beat ... ");
35
+						Integer jobLogId = JobMonitorHelper.helper.queue.take();
36
+						if (jobLogId != null && jobLogId > 0) {
37
+							logger.info(">>>>>>>>>>> job monitor heat success, JobLogId:{}", jobLogId);
38
+							XxlJobLog log = DynamicSchedulerUtil.xxlJobLogDao.load(jobLogId);
39
+							if (log!=null) {
40
+								if (RemoteCallBack.SUCCESS.equals(log.getTriggerStatus()) && StringUtils.isBlank(log.getHandleStatus())) {
41
+									try {
42
+										TimeUnit.SECONDS.sleep(10);
43
+									} catch (InterruptedException e) {
44
+										e.printStackTrace();
45
+									}
46
+									JobMonitorHelper.monitor(jobLogId);
43
 								}
47
 								}
44
-								JobMonitorHelper.monitor(jobLogId);
45
-							}
46
-							if (RemoteCallBack.SUCCESS.equals(log.getTriggerStatus()) && RemoteCallBack.SUCCESS.equals(log.getHandleStatus())) {
47
-								// pass
48
-							}
49
-							if (RemoteCallBack.FAIL.equals(log.getTriggerStatus()) || RemoteCallBack.FAIL.equals(log.getHandleStatus())) {
50
-								XxlJobInfo info = DynamicSchedulerUtil.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
51
-								if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {
52
-									MailUtil.sendMail(info.getAlarmEmail(), "《调度监控报警-调度平台平台XXL-JOB》",
53
-											MessageFormat.format("任务调度失败, JobKey={0}, 任务描述:{1}.", info.getJobKey(), info.getJobDesc()), false, null);
48
+								if (RemoteCallBack.SUCCESS.equals(log.getTriggerStatus()) && RemoteCallBack.SUCCESS.equals(log.getHandleStatus())) {
49
+									// pass
50
+								}
51
+								if (RemoteCallBack.FAIL.equals(log.getTriggerStatus()) || RemoteCallBack.FAIL.equals(log.getHandleStatus())) {
52
+									XxlJobInfo info = DynamicSchedulerUtil.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
53
+									if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {
54
+										MailUtil.sendMail(info.getAlarmEmail(), "《调度监控报警-调度平台平台XXL-JOB》",
55
+												MessageFormat.format("任务调度失败, 任务组:{0}, 任务描述:{1}.", info.getJobGroup(), info.getJobDesc()), false, null);
56
+									}
54
 								}
57
 								}
55
 							}
58
 							}
56
 						}
59
 						}
57
-					} else {
58
-						try {
59
-							TimeUnit.SECONDS.sleep(20);
60
-						} catch (InterruptedException e) {
61
-							e.printStackTrace();
62
-						}
60
+					} catch (Exception e) {
61
+						logger.error("job monitor error:{}", e);
63
 					}
62
 					}
64
 				}
63
 				}
65
 			}
64
 			}

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java 查看文件

12
  */
12
  */
13
 public interface IXxlJobInfoDao {
13
 public interface IXxlJobInfoDao {
14
 
14
 
15
-	public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String jobDesc);
16
-	public int pageListCount(int offset, int pagesize, String jobGroup, String jobDesc);
15
+	public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String executorHandler);
16
+	public int pageListCount(int offset, int pagesize, String jobGroup, String executorHandler);
17
 	
17
 	
18
 	public int save(XxlJobInfo info);
18
 	public int save(XxlJobInfo info);
19
 	
19
 	

+ 4 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java 查看文件

23
 	public SqlSessionTemplate sqlSessionTemplate;
23
 	public SqlSessionTemplate sqlSessionTemplate;
24
 
24
 
25
 	@Override
25
 	@Override
26
-	public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String jobDesc) {
26
+	public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String executorHandler) {
27
 		HashMap<String, Object> params = new HashMap<String, Object>();
27
 		HashMap<String, Object> params = new HashMap<String, Object>();
28
 		params.put("offset", offset);
28
 		params.put("offset", offset);
29
 		params.put("pagesize", pagesize);
29
 		params.put("pagesize", pagesize);
30
 		params.put("jobGroup", jobGroup);
30
 		params.put("jobGroup", jobGroup);
31
-		params.put("jobDesc", jobDesc);
31
+		params.put("executorHandler", executorHandler);
32
 		
32
 		
33
 		return sqlSessionTemplate.selectList("XxlJobInfoMapper.pageList", params);
33
 		return sqlSessionTemplate.selectList("XxlJobInfoMapper.pageList", params);
34
 	}
34
 	}
35
 
35
 
36
 	@Override
36
 	@Override
37
-	public int pageListCount(int offset, int pagesize, String jobGroup, String jobDesc) {
37
+	public int pageListCount(int offset, int pagesize, String jobGroup, String executorHandler) {
38
 		HashMap<String, Object> params = new HashMap<String, Object>();
38
 		HashMap<String, Object> params = new HashMap<String, Object>();
39
 		params.put("offset", offset);
39
 		params.put("offset", offset);
40
 		params.put("pagesize", pagesize);
40
 		params.put("pagesize", pagesize);
41
 		params.put("jobGroup", jobGroup);
41
 		params.put("jobGroup", jobGroup);
42
-		params.put("jobDesc", jobDesc);
42
+		params.put("executorHandler", executorHandler);
43
 		
43
 		
44
 		return sqlSessionTemplate.selectOne("XxlJobInfoMapper.pageListCount", params);
44
 		return sqlSessionTemplate.selectOne("XxlJobInfoMapper.pageListCount", params);
45
 	}
45
 	}

+ 5 - 6
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java 查看文件

11
  */
11
  */
12
 public interface IXxlJobService {
12
 public interface IXxlJobService {
13
 	
13
 	
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 executorHandler, String filterTime);
15
 	
15
 	
16
-	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
17
-			String executorAddress,	String executorParam, String author, String alarmEmail,
18
-			int glueSwitch, String glueSource, String glueRemark);
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);
19
 	
18
 	
20
-	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
21
-			String handler_address, String handler_params, String author, String alarmEmail);
19
+	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
20
+			String executorAddress, String executorHandler, String executorParam, int glueSwitch);
22
 	
21
 	
23
 	public ReturnT<String> remove(String jobGroup, String jobName);
22
 	public ReturnT<String> remove(String jobGroup, String jobName);
24
 	
23
 	

+ 53 - 42
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java 查看文件

1
 package com.xxl.job.admin.service.impl;
1
 package com.xxl.job.admin.service.impl;
2
 
2
 
3
-import java.util.*;
4
-
5
-import javax.annotation.Resource;
6
-
7
-import org.apache.commons.lang.StringUtils;
8
-import org.apache.commons.lang.time.DateFormatUtils;
9
-import org.apache.commons.lang.time.FastDateFormat;
10
-import org.quartz.CronExpression;
11
-import org.quartz.SchedulerException;
12
-import org.springframework.stereotype.Service;
13
-
14
 import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
3
 import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
15
-import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
16
 import com.xxl.job.admin.core.model.ReturnT;
4
 import com.xxl.job.admin.core.model.ReturnT;
17
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
18
 import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
6
 import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
20
 import com.xxl.job.admin.dao.IXxlJobLogDao;
8
 import com.xxl.job.admin.dao.IXxlJobLogDao;
21
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
9
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
22
 import com.xxl.job.admin.service.IXxlJobService;
10
 import com.xxl.job.admin.service.IXxlJobService;
11
+import org.apache.commons.lang.StringUtils;
12
+import org.apache.commons.lang.time.FastDateFormat;
13
+import org.quartz.CronExpression;
14
+import org.quartz.SchedulerException;
15
+import org.slf4j.Logger;
16
+import org.slf4j.LoggerFactory;
17
+import org.springframework.stereotype.Service;
18
+
19
+import javax.annotation.Resource;
20
+import java.util.Date;
21
+import java.util.HashMap;
22
+import java.util.List;
23
+import java.util.Map;
23
 
24
 
24
 /**
25
 /**
25
  * core job service for xxl-job
26
  * core job service for xxl-job
27
  */
28
  */
28
 @Service
29
 @Service
29
 public class XxlJobServiceImpl implements IXxlJobService {
30
 public class XxlJobServiceImpl implements IXxlJobService {
31
+	private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class);
30
 
32
 
31
 	@Resource
33
 	@Resource
32
 	private IXxlJobInfoDao xxlJobInfoDao;
34
 	private IXxlJobInfoDao xxlJobInfoDao;
36
 	private IXxlJobLogGlueDao xxlJobLogGlueDao;
38
 	private IXxlJobLogGlueDao xxlJobLogGlueDao;
37
 	
39
 	
38
 	@Override
40
 	@Override
39
-	public Map<String, Object> pageList(int start, int length, String jobGroup, String jobDesc, String filterTime) {
40
-		
41
+	public Map<String, Object> pageList(int start, int length, String jobGroup, String executorHandler, String filterTime) {
42
+
41
 		// page list
43
 		// page list
42
-		List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, jobDesc);
43
-		int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, jobDesc);
44
+		List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, executorHandler);
45
+		int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, executorHandler);
44
 		
46
 		
45
 		// fill job info
47
 		// fill job info
46
 		if (list!=null && list.size()>0) {
48
 		if (list!=null && list.size()>0) {
58
 	}
60
 	}
59
 
61
 
60
 	@Override
62
 	@Override
61
-	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
62
-			String executorAddress,	String executorParam, String author, String alarmEmail,
63
-			int glueSwitch, String glueSource, String glueRemark) {
63
+	public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
64
+			String executorAddress,	String executorHandler, String executorParam, int glueSwitch, String glueSource, String glueRemark) {
64
 		// valid
65
 		// valid
65
 		if (JobGroupEnum.match(jobGroup) == null) {
66
 		if (JobGroupEnum.match(jobGroup) == null) {
66
 			return new ReturnT<String>(500, "请选择“任务组”");
67
 			return new ReturnT<String>(500, "请选择“任务组”");
71
 		if (StringUtils.isBlank(jobDesc)) {
72
 		if (StringUtils.isBlank(jobDesc)) {
72
 			return new ReturnT<String>(500, "请输入“任务描述”");
73
 			return new ReturnT<String>(500, "请输入“任务描述”");
73
 		}
74
 		}
74
-		if (StringUtils.isBlank(executorAddress)) {
75
-			return new ReturnT<String>(500, "请输入“执行器地址”");
76
-		}
77
 		if (StringUtils.isBlank(author)) {
75
 		if (StringUtils.isBlank(author)) {
78
 			return new ReturnT<String>(500, "请输入“负责人”");
76
 			return new ReturnT<String>(500, "请输入“负责人”");
79
 		}
77
 		}
80
 		if (StringUtils.isBlank(alarmEmail)) {
78
 		if (StringUtils.isBlank(alarmEmail)) {
81
 			return new ReturnT<String>(500, "请输入“报警邮件”");
79
 			return new ReturnT<String>(500, "请输入“报警邮件”");
82
 		}
80
 		}
81
+		if (StringUtils.isBlank(executorAddress)) {
82
+			return new ReturnT<String>(500, "请输入“执行器地址”");
83
+		}
84
+		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
85
+			return new ReturnT<String>(500, "请输入“JobHandler”");
86
+		}
83
 
87
 
84
 		// generate jobName
88
 		// generate jobName
85
 		String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
89
 		String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
100
 		jobInfo.setJobDesc(jobDesc);
104
 		jobInfo.setJobDesc(jobDesc);
101
 		jobInfo.setAuthor(author);
105
 		jobInfo.setAuthor(author);
102
 		jobInfo.setAlarmEmail(alarmEmail);
106
 		jobInfo.setAlarmEmail(alarmEmail);
107
+		jobInfo.setExecutorAddress(executorAddress);
108
+		jobInfo.setExecutorHandler(executorHandler);
109
+		jobInfo.setExecutorParam(executorParam);
103
 		jobInfo.setGlueSwitch(glueSwitch);
110
 		jobInfo.setGlueSwitch(glueSwitch);
104
 		jobInfo.setGlueSource(glueSource);
111
 		jobInfo.setGlueSource(glueSource);
105
 		jobInfo.setGlueRemark(glueRemark);
112
 		jobInfo.setGlueRemark(glueRemark);
106
-		jobInfo.setExecutorAddress(executorAddress);
107
-		jobInfo.setExecutorParam(executorParam);
108
-		xxlJobInfoDao.save(jobInfo);
109
 
113
 
110
 		try {
114
 		try {
111
 			// add job 2 quartz
115
 			// add job 2 quartz
112
 			boolean result = DynamicSchedulerUtil.addJob(jobInfo);
116
 			boolean result = DynamicSchedulerUtil.addJob(jobInfo);
113
 			if (result) {
117
 			if (result) {
118
+				xxlJobInfoDao.save(jobInfo);
114
 				return ReturnT.SUCCESS;
119
 				return ReturnT.SUCCESS;
115
 			} else {
120
 			} else {
116
-				xxlJobInfoDao.delete(jobGroup, jobName);
117
 				return new ReturnT<String>(500, "新增任务失败");
121
 				return new ReturnT<String>(500, "新增任务失败");
118
 			}
122
 			}
119
 		} catch (SchedulerException e) {
123
 		} catch (SchedulerException e) {
120
-			e.printStackTrace();
124
+			logger.error("", e);
121
 		}
125
 		}
122
 		return ReturnT.FAIL;
126
 		return ReturnT.FAIL;
123
 	}
127
 	}
124
 
128
 
125
 	@Override
129
 	@Override
126
-	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc,
127
-			String executorAddress, String executorParam,
128
-			String author, String alarmEmail) {
129
-		
130
+	public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
131
+			String executorAddress, String executorHandler, String executorParam, int glueSwitch) {
132
+
130
 		// valid
133
 		// valid
131
 		if (JobGroupEnum.match(jobGroup) == null) {
134
 		if (JobGroupEnum.match(jobGroup) == null) {
132
 			return new ReturnT<String>(500, "请选择“任务组”");
135
 			return new ReturnT<String>(500, "请选择“任务组”");
140
 		if (StringUtils.isBlank(jobDesc)) {
143
 		if (StringUtils.isBlank(jobDesc)) {
141
 			return new ReturnT<String>(500, "请输入“任务描述”");
144
 			return new ReturnT<String>(500, "请输入“任务描述”");
142
 		}
145
 		}
143
-		if (StringUtils.isBlank(executorAddress)) {
144
-			return new ReturnT<String>(500, "请输入“执行器地址”");
145
-		}
146
 		if (StringUtils.isBlank(author)) {
146
 		if (StringUtils.isBlank(author)) {
147
 			return new ReturnT<String>(500, "请输入“负责人”");
147
 			return new ReturnT<String>(500, "请输入“负责人”");
148
 		}
148
 		}
149
 		if (StringUtils.isBlank(alarmEmail)) {
149
 		if (StringUtils.isBlank(alarmEmail)) {
150
 			return new ReturnT<String>(500, "请输入“报警邮件”");
150
 			return new ReturnT<String>(500, "请输入“报警邮件”");
151
 		}
151
 		}
152
-		
152
+		if (StringUtils.isBlank(executorAddress)) {
153
+			return new ReturnT<String>(500, "请输入“执行器地址”");
154
+		}
155
+		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
156
+			return new ReturnT<String>(500, "请输入“JobHandler”");
157
+		}
158
+
159
+		// stage job info
153
 		XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
160
 		XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
154
-		jobInfo.setJobDesc(jobDesc);
155
 		jobInfo.setJobCron(jobCron);
161
 		jobInfo.setJobCron(jobCron);
162
+		jobInfo.setJobDesc(jobDesc);
156
 		jobInfo.setAuthor(author);
163
 		jobInfo.setAuthor(author);
157
 		jobInfo.setAlarmEmail(alarmEmail);
164
 		jobInfo.setAlarmEmail(alarmEmail);
158
 		jobInfo.setExecutorAddress(executorAddress);
165
 		jobInfo.setExecutorAddress(executorAddress);
166
+		jobInfo.setExecutorHandler(executorHandler);
159
 		jobInfo.setExecutorParam(executorParam);
167
 		jobInfo.setExecutorParam(executorParam);
168
+		jobInfo.setGlueSwitch(glueSwitch);
160
 		
169
 		
161
 		try {
170
 		try {
162
 			// fresh quartz
171
 			// fresh quartz
163
-			DynamicSchedulerUtil.rescheduleJob(jobInfo);
164
-			
165
-			// fresh db
166
-			xxlJobInfoDao.update(jobInfo);
167
-			return ReturnT.SUCCESS;
172
+			boolean ret = DynamicSchedulerUtil.rescheduleJob(jobInfo);
173
+			if (ret) {
174
+				xxlJobInfoDao.update(jobInfo);
175
+				return ReturnT.SUCCESS;
176
+			} else {
177
+				return new ReturnT<String>(500, "更新任务失败");
178
+			}
168
 		} catch (SchedulerException e) {
179
 		} catch (SchedulerException e) {
169
-			e.printStackTrace();
180
+			logger.error("", e);
170
 		}
181
 		}
171
 		return ReturnT.FAIL;
182
 		return ReturnT.FAIL;
172
 	}
183
 	}

+ 9 - 4
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml 查看文件

18
 	    <result column="alarm_email" property="alarmEmail" />
18
 	    <result column="alarm_email" property="alarmEmail" />
19
 	    
19
 	    
20
 	    <result column="executor_address" property="executorAddress" />
20
 	    <result column="executor_address" property="executorAddress" />
21
+		<result column="executor_handler" property="executorHandler" />
21
 	    <result column="executor_param" property="executorParam" />
22
 	    <result column="executor_param" property="executorParam" />
22
 	    
23
 	    
23
 	    <result column="glue_switch" property="glueSwitch" />
24
 	    <result column="glue_switch" property="glueSwitch" />
36
 		t.author,
37
 		t.author,
37
 		t.alarm_email,
38
 		t.alarm_email,
38
 		t.executor_address,
39
 		t.executor_address,
40
+		t.executor_handler,
39
 		t.executor_param,
41
 		t.executor_param,
40
 		t.glue_switch,
42
 		t.glue_switch,
41
 		t.glue_source,
43
 		t.glue_source,
49
 			<if test="jobGroup != null and jobGroup != ''">
51
 			<if test="jobGroup != null and jobGroup != ''">
50
 				AND t.job_group = #{jobGroup}
52
 				AND t.job_group = #{jobGroup}
51
 			</if>
53
 			</if>
52
-			<if test="jobDesc != null and jobDesc != ''">
53
-				AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')
54
+			<if test="executorHandler != null and executorHandler != ''">
55
+				AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%')
54
 			</if>
56
 			</if>
55
 		</trim>
57
 		</trim>
56
 		ORDER BY id DESC
58
 		ORDER BY id DESC
64
 			<if test="jobGroup != null and jobGroup != ''">
66
 			<if test="jobGroup != null and jobGroup != ''">
65
 				AND t.job_group = #{jobGroup}
67
 				AND t.job_group = #{jobGroup}
66
 			</if>
68
 			</if>
67
-			<if test="jobDesc != null and jobDesc != ''">
68
-				AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')
69
+			<if test="executorHandler != null and executorHandler != ''">
70
+				AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%')
69
 			</if>
71
 			</if>
70
 		</trim>
72
 		</trim>
71
 	</select>
73
 	</select>
81
 			author,
83
 			author,
82
 			alarm_email,
84
 			alarm_email,
83
 			executor_address,
85
 			executor_address,
86
+			executor_handler,
84
 			executor_param,
87
 			executor_param,
85
 			glue_switch,
88
 			glue_switch,
86
 			glue_source,
89
 			glue_source,
95
 			#{author},
98
 			#{author},
96
 			#{alarmEmail},
99
 			#{alarmEmail},
97
 			#{executorAddress},
100
 			#{executorAddress},
101
+			#{executorHandler},
98
 			#{executorParam},
102
 			#{executorParam},
99
 			#{glueSwitch},
103
 			#{glueSwitch},
100
 			#{glueSource},
104
 			#{glueSource},
121
 			author = #{author},
125
 			author = #{author},
122
 			alarm_email = #{alarmEmail},
126
 			alarm_email = #{alarmEmail},
123
 			executor_address = #{executorAddress},
127
 			executor_address = #{executorAddress},
128
+			executor_handler = #{executorHandler},
124
 			executor_param = #{executorParam},
129
 			executor_param = #{executorParam},
125
 			glue_switch = #{glueSwitch},
130
 			glue_switch = #{glueSwitch},
126
 			glue_source = #{glueSource},
131
 			glue_source = #{glueSource},

+ 26 - 31
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl 查看文件

38
 	    <section class="content">
38
 	    <section class="content">
39
 	    
39
 	    
40
 	    	<div class="row">
40
 	    	<div class="row">
41
-	    		<div class="col-xs-2">
41
+	    		<div class="col-xs-4">
42
 	              	<div class="input-group">
42
 	              	<div class="input-group">
43
 	                	<span class="input-group-addon">分组</span>
43
 	                	<span class="input-group-addon">分组</span>
44
                 		<select class="form-control" id="jobGroup" >
44
                 		<select class="form-control" id="jobGroup" >
48
 	                  	</select>
48
 	                  	</select>
49
 	              	</div>
49
 	              	</div>
50
 	            </div>
50
 	            </div>
51
-                <div class="col-xs-3">
51
+                <div class="col-xs-4">
52
                     <div class="input-group">
52
                     <div class="input-group">
53
-                        <span class="input-group-addon">JobKey</span>
54
-                        <input type="text" class="form-control" id="JobKey" value="${jobName}" autocomplete="on" >
53
+                        <span class="input-group-addon">JobHandler</span>
54
+                        <input type="text" class="form-control" id="executorHandler" value="${jobName}" autocomplete="on" >
55
                     </div>
55
                     </div>
56
                 </div>
56
                 </div>
57
-	            <div class="col-xs-3">
58
-	              	<div class="input-group">
59
-	                	<span class="input-group-addon">描述</span>
60
-	                	<input type="text" class="form-control" id="jobDesc" value="${jobName}" autocomplete="on" >
61
-	              	</div>
62
-	            </div>
63
 	            <div class="col-xs-2">
57
 	            <div class="col-xs-2">
64
 	            	<button class="btn btn-block btn-info" id="searchBtn">搜索</button>
58
 	            	<button class="btn btn-block btn-info" id="searchBtn">搜索</button>
65
 	            </div>
59
 	            </div>
81
 					            		<th name="id" >id</th>
75
 					            		<th name="id" >id</th>
82
 					                	<th name="jobGroup" >jobGroup</th>
76
 					                	<th name="jobGroup" >jobGroup</th>
83
 					                  	<th name="jobName" >jobName</th>
77
 					                  	<th name="jobName" >jobName</th>
84
-                                        <th name="JobKey" >JobKey</th>
85
 					                  	<th name="jobDesc" >描述</th>
78
 					                  	<th name="jobDesc" >描述</th>
86
 					                  	<th name="jobCron" >Cron</th>
79
 					                  	<th name="jobCron" >Cron</th>
87
 					                  	<th name="executorAddress" >执行器地址</th>
80
 					                  	<th name="executorAddress" >执行器地址</th>
81
+                                        <th name="executorHandler" >JobJandler</th>
88
 					                  	<th name="executorParam" >任务参数</th>
82
 					                  	<th name="executorParam" >任务参数</th>
89
 					                  	<th name="addTime" >新增时间</th>
83
 					                  	<th name="addTime" >新增时间</th>
90
 					                  	<th name="updateTime" >更新时间</th>
84
 					                  	<th name="updateTime" >更新时间</th>
137
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
131
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
138
 					</div>
132
 					</div>
139
 					<div class="form-group">
133
 					<div class="form-group">
140
-                        <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
141
-                        <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
142
-                        <label for="firstname" class="col-sm-2 control-label">任务模式<font color="red">*</font></label>
134
+                        <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
143
                         <div class="col-sm-4">
135
                         <div class="col-sm-4">
144
-                            <select class="form-control" name="glueSwitch" >
145
-                                <option value="0" >BEAN模式</option>
146
-                                <option value="1" >GLUE模式</option>
147
-                            </select>
148
-                        </div>
136
+                            <div class="input-group">
137
+								<input type="text" class="form-control" name="executorHandler" placeholder="请输入“JobHandler”" maxlength="100" >
138
+								<span class="input-group-addon"><b>GLUE</b>&nbsp;<input type="checkbox" class="ifGLUE" ></span>
139
+                                <input type="hidden" name="glueSwitch" value="0" >
140
+                            </div>
141
+						</div>
142
+						<label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
143
+                        <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
149
 					</div>
144
 					</div>
150
 					<div class="form-group">
145
 					<div class="form-group">
151
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
146
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
212
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
207
                         <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
213
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
208
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
214
 					</div>
209
 					</div>
215
-					
216
-					<div class="form-group">
217
-                        <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
218
-                        <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
219
-                        <label for="firstname" class="col-sm-2 control-label">任务模式<font color="red">*</font></label>
210
+                    <div class="form-group">
211
+                        <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
220
                         <div class="col-sm-4">
212
                         <div class="col-sm-4">
221
-                            <input type="text" class="form-control glueSwitchTitle" readonly >
213
+                            <div class="input-group">
214
+                                <input type="text" class="form-control" name="executorHandler" placeholder="请输入“JobHandler”" maxlength="100" >
215
+                                <span class="input-group-addon"><b>GLUE</b>&nbsp;<input type="checkbox" class="ifGLUE" ></span>
216
+                                <input type="hidden" name="glueSwitch" value="0" >
217
+                            </div>
222
                         </div>
218
                         </div>
223
-					</div>
219
+                        <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>
221
+                    </div>
222
+
224
 					<div class="form-group">
223
 					<div class="form-group">
225
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
224
 						<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="alarmEmail" placeholder="请输入“报警邮件”,多个邮件地址逗号分隔" maxlength="100" ></div>
225
 						<div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="请输入“报警邮件”,多个邮件地址逗号分隔" maxlength="100" ></div>
229
 					</div>
228
 					</div>
230
 					<hr>
229
 					<hr>
231
 					<div class="form-group">
230
 					<div class="form-group">
232
-						<div class="col-sm-offset-3 col-sm-3">
231
+                        <div class="col-sm-offset-3 col-sm-6">
233
 							<button type="submit" class="btn btn-primary"  >保存</button>
232
 							<button type="submit" class="btn btn-primary"  >保存</button>
234
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
233
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
235
                             <input type="hidden" name="jobGroup" >
234
                             <input type="hidden" name="jobGroup" >
236
                             <input type="hidden" name="jobName" >
235
                             <input type="hidden" name="jobName" >
237
 						</div>
236
 						</div>
238
-                        <label for="firstname" class="col-sm-2 control-label">JobKey</label>
239
-                        <div class="col-sm-4">
240
-                            <input type="text" class="form-control jobKey" readonly >
241
-                        </div>
242
 					</div>
237
 					</div>
243
 				</form>
238
 				</form>
244
          	</div>
239
          	</div>

+ 69 - 48
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js 查看文件

10
 	        data : function ( d ) {
10
 	        data : function ( d ) {
11
 	        	var obj = {};
11
 	        	var obj = {};
12
 	        	obj.jobGroup = $('#jobGroup').val();
12
 	        	obj.jobGroup = $('#jobGroup').val();
13
-	        	obj.jobDesc = $('#jobDesc').val();
13
+	        	obj.executorHandler = $('#executorHandler').val();
14
 	        	obj.start = d.start;
14
 	        	obj.start = d.start;
15
 	        	obj.length = d.length;
15
 	        	obj.length = d.length;
16
                 return obj;
16
                 return obj;
35
 	            		}
35
 	            		}
36
             		},
36
             		},
37
 					{ "data": 'jobName', "visible" : false},
37
 					{ "data": 'jobName', "visible" : false},
38
-					{ "data": 'jobKey', "visible" : true},
39
 	                { "data": 'jobDesc', "visible" : true},
38
 	                { "data": 'jobDesc', "visible" : true},
40
 	                { "data": 'jobCron', "visible" : true},
39
 	                { "data": 'jobCron', "visible" : true},
41
 	                { "data": 'executorAddress', "visible" : false},
40
 	                { "data": 'executorAddress', "visible" : false},
41
+					{ "data": 'executorHandler', "visible" : false},
42
 	                { "data": 'executorParam', "visible" : false},
42
 	                { "data": 'executorParam', "visible" : false},
43
 	                { 
43
 	                { 
44
 	                	"data": 'addTime', 
44
 	                	"data": 'addTime', 
87
 	                			// log url
87
 	                			// log url
88
 	                			var codeBtn = "";
88
 	                			var codeBtn = "";
89
 	                			if(row.glueSwitch > 0){
89
 	                			if(row.glueSwitch > 0){
90
-	                				var codeUrl = base_url +'/jobcode?jobGroup='+ row.jobGroup +'&jobName='+ row.jobName;
91
-	                				codeBtn = '<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(\'' + codeUrl + '\')" >GLUE</button>  '
92
-	                			}
90
+									var codeUrl = base_url +'/jobcode?jobGroup='+ row.jobGroup +'&jobName='+ row.jobName;
91
+									codeBtn = '<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(\'' + codeUrl + '\')" >GLUE</button>  '
92
+								}
93
 
93
 
94
-	                			var html = '<p id="'+ row.id +'" '+
95
-	                							' jobGroup="'+ row.jobGroup +'" '+
96
-	                							' jobName="'+ row.jobName +'" '+
97
-												' jobKey="'+ row.jobKey +'" '+
98
-	                							' jobCron="'+ row.jobCron +'" '+
99
-	                							' jobDesc="'+ row.jobDesc +'" '+
100
-	                							' executorAddress="'+row.executorAddress +'" '+
101
-	                							' executorParam="'+ row.executorParam +'" '+
102
-	                							' author="'+ row.author +'" '+
103
-	                							' alarmEmail="'+ row.alarmEmail +'" '+
104
-	                							' glueSwitch="'+ row.glueSwitch +'" '+
105
-	                							'>'+
106
-										'<button class="btn btn-primary btn-xs job_operate" type="job_trigger" type="button">执行</button>  '+
107
-										pause_resume +
108
-										'<button class="btn btn-primary btn-xs" type="job_del" type="button" onclick="javascript:window.open(\'' + logUrl + '\')" >日志</button><br>  '+
109
-										'<button class="btn btn-warning btn-xs update" type="button">编辑</button>  '+
110
-										codeBtn +
111
-								  		'<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button>  '+
94
+								// html
95
+								var html = '<p id="'+ row.id +'" '+
96
+									' jobGroup="'+ row.jobGroup +'" '+
97
+									' jobName="'+ row.jobName +'" '+
98
+									' jobCron="'+ row.jobCron +'" '+
99
+									' jobDesc="'+ row.jobDesc +'" '+
100
+									' author="'+ row.author +'" '+
101
+									' alarmEmail="'+ row.alarmEmail +'" '+
102
+									' executorAddress="'+row.executorAddress +'" '+
103
+									' executorHandler="'+row.executorHandler +'" '+
104
+									' executorParam="'+ row.executorParam +'" '+
105
+									' glueSwitch="'+ row.glueSwitch +'" '+
106
+									'>'+
107
+									'<button class="btn btn-primary btn-xs job_operate" type="job_trigger" type="button">执行</button>  '+
108
+									pause_resume +
109
+									'<button class="btn btn-primary btn-xs" type="job_del" type="button" onclick="javascript:window.open(\'' + logUrl + '\')" >日志</button><br>  '+
110
+									'<button class="btn btn-warning btn-xs update" type="button">编辑</button>  '+
111
+									codeBtn +
112
+									'<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button>  '+
112
 									'</p>';
113
 									'</p>';
113
-									
114
-	                			
114
+
115
 	                			return html;
115
 	                			return html;
116
-	                		};
116
+							};
117
 	                	}
117
 	                	}
118
 	                }
118
 	                }
119
 	            ],
119
 	            ],
221
             executorAddress : {
221
             executorAddress : {
222
             	required : true
222
             	required : true
223
             },
223
             },
224
+			executorHandler : {
225
+				required : false
226
+			},
224
             alarmEmail : {
227
             alarmEmail : {
225
             	required : true
228
             	required : true
226
             },
229
             },
238
             executorAddress : {
241
             executorAddress : {
239
             	required :"请输入“执行器地址”."
242
             	required :"请输入“执行器地址”."
240
             },
243
             },
244
+			executorHandler : {
245
+				required : "请输入“jobHandler”."
246
+			},
241
             alarmEmail : {
247
             alarmEmail : {
242
             	required : "请输入“报警邮件”."
248
             	required : "请输入“报警邮件”."
243
             },
249
             },
277
 		$("#addModal .form .form-group").removeClass("has-error");
283
 		$("#addModal .form .form-group").removeClass("has-error");
278
 		$(".remote_panel").show();	// remote
284
 		$(".remote_panel").show();	// remote
279
 	});
285
 	});
286
+
287
+	// GLUE模式开启
288
+	$(".ifGLUE").click(function(){
289
+		var ifGLUE = $(this).is(':checked');
290
+		var $executorHandler = $(this).parents("form").find("input[name='executorHandler']");
291
+		var $glueSwitch = $(this).parents("form").find("input[name='glueSwitch']");
292
+		if (ifGLUE) {
293
+			$executorHandler.val("");
294
+			$executorHandler.attr("readonly","readonly");
295
+			$glueSwitch.val(1);
296
+		} else {
297
+			$executorHandler.removeAttr("readonly");
298
+			$glueSwitch.val(0);
299
+		}
300
+	});
280
 	
301
 	
281
 	// 更新
302
 	// 更新
282
 	$("#job_list").on('click', '.update',function() {
303
 	$("#job_list").on('click', '.update',function() {
284
 		// base data
305
 		// base data
285
 		$("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup"));
306
 		$("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup"));
286
 		$("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName"));
307
 		$("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName"));
287
-		$("#updateModal .form .jobKey").val( $(this).parent('p').attr("jobKey") );
288
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
308
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
289
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
309
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
290
-		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
291
-		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
292
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
310
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
293
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
311
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
312
+		$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
313
+		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
314
+		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
294
 
315
 
295
 		// jobGroupTitle
316
 		// jobGroupTitle
296
 		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
317
 		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
297
 		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
318
 		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
298
 
319
 
299
-        // glueSwitchTitle
300
-		$("#updateModal .form .glueSwitchTitle").val( ($(this).parent('p').attr("glueSwitch") == 0)?"BEAN模式":"GLUE模式" );
320
+        // glueSwitch
321
+		var glueSwitch = $(this).parent('p').attr("glueSwitch");
322
+		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);
323
+		var $ifGLUE = $("#updateModal .form .ifGLUE");
324
+		var $executorHandler = $("#updateModal .form input[name='executorHandler']");
325
+		if (glueSwitch == 1) {
326
+			$ifGLUE.attr("checked", true);
327
+			$executorHandler.val("");
328
+			$executorHandler.attr("readonly","readonly");
329
+		} else {
330
+			$ifGLUE.attr("checked", false);
331
+			$executorHandler.removeAttr("readonly");
332
+		}
301
 
333
 
302
 		// show
334
 		// show
303
 		$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
335
 		$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
318
 			executorAddress : {
350
 			executorAddress : {
319
 				required : true
351
 				required : true
320
 			},
352
 			},
353
+			executorHandler : {
354
+				required : false
355
+			},
321
 			alarmEmail : {
356
 			alarmEmail : {
322
 				required : true
357
 				required : true
323
 			},
358
 			},
335
 			executorAddress : {
370
 			executorAddress : {
336
 				required :"请输入“执行器地址”."
371
 				required :"请输入“执行器地址”."
337
 			},
372
 			},
373
+			executorHandler : {
374
+				required : "请输入“jobHandler”."
375
+			},
338
 			alarmEmail : {
376
 			alarmEmail : {
339
 				required : "请输入“报警邮件”."
377
 				required : "请输入“报警邮件”."
340
 			},
378
 			},
353
             element.parent('div').append(error);  
391
             element.parent('div').append(error);  
354
         },
392
         },
355
         submitHandler : function(form) {
393
         submitHandler : function(form) {
356
-
357
 			// post
394
 			// post
358
     		$.post(base_url + "/jobinfo/reschedule", $("#updateModal .form").serialize(), function(data, status) {
395
     		$.post(base_url + "/jobinfo/reschedule", $("#updateModal .form").serialize(), function(data, status) {
359
     			if (data.code == "200") {
396
     			if (data.code == "200") {
374
 		$("#updateModal .form")[0].reset()
411
 		$("#updateModal .form")[0].reset()
375
 	});
412
 	});
376
 
413
 
377
-	// GLUE模式开启
378
-	/*
379
-	 $("#addModal .form .ifGLUE").click(function(){
380
-         var ifGLUE = $(this).is(':checked');
381
-         var $executorHandler = $("#addModal .form input[name='executorHandler']");
382
-         var $glueSwitch = $("#addModal .form input[name='glueSwitch']");
383
-         if (ifGLUE) {
384
-         $executorHandler.val("");
385
-         $executorHandler.attr("readonly","readonly");
386
-         $glueSwitch.val(1);
387
-         } else {
388
-         $executorHandler.removeAttr("readonly");
389
-         $glueSwitch.val(0);
390
-         }
391
-	 });
392
-	 */
393
 
414
 
394
 	/*
415
 	/*
395
 	// 新增-添加参数
416
 	// 新增-添加参数

+ 1 - 0
xxl-job-core/src/main/java/com/xxl/job/core/handler/HandlerThread.java 查看文件

56
 	public void run() {
56
 	public void run() {
57
 		while(!toStop){
57
 		while(!toStop){
58
 			try {
58
 			try {
59
+				// to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout)
59
 				Map<String, String> handlerData = handlerDataQueue.poll(3L, TimeUnit.SECONDS);
60
 				Map<String, String> handlerData = handlerDataQueue.poll(3L, TimeUnit.SECONDS);
60
 				if (handlerData!=null) {
61
 				if (handlerData!=null) {
61
 					i= 0;
62
 					i= 0;