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

1、任务属性新增"路由策略"并设计交互;

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

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

@@ -88,10 +88,10 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
88 88
 ![输入图片说明](https://static.oschina.net/uploads/img/201703/07162326_L3VB.png "在这里输入图片标题")
89 89
 
90 90
 #### 1.5 环境
91
+- Servlet/JSP Spec:3.0/2.2
91 92
 - JDK:1.7+
92
-- Tomcat:7+
93
+- Tomcat:7+/Jetty8+
93 94
 - Mysql:5.6+
94
-- Servlet/JSP Spec:3.0/2.2
95 95
 - Maven:3+
96 96
 
97 97
 

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

@@ -5,7 +5,6 @@ import com.xxl.job.admin.core.model.XxlJobLogGlue;
5 5
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
6 6
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
7 7
 import com.xxl.job.core.biz.model.ReturnT;
8
-import org.apache.commons.lang.StringUtils;
9 8
 import org.springframework.stereotype.Controller;
10 9
 import org.springframework.ui.Model;
11 10
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,9 +27,9 @@ public class JobCodeController {
28 27
 	private IXxlJobLogGlueDao xxlJobLogGlueDao;
29 28
 
30 29
 	@RequestMapping
31
-	public String index(Model model, int jobGroup, String jobName) {
32
-		XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
33
-		List<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.selectList(jobGroup, jobName);
30
+	public String index(Model model, int jobId) {
31
+		XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
32
+		List<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
34 33
 		model.addAttribute("jobInfo", jobInfo);
35 34
 		model.addAttribute("jobLogGlues", jobLogGlues);
36 35
 		return "jobcode/jobcode.index";
@@ -38,7 +37,7 @@ public class JobCodeController {
38 37
 	
39 38
 	@RequestMapping("/save")
40 39
 	@ResponseBody
41
-	public ReturnT<String> save(Model model, int jobGroup, String jobName, String glueSource, String glueRemark) {
40
+	public ReturnT<String> save(Model model, int id, String glueSource, String glueRemark) {
42 41
 		// valid
43 42
 		if (glueRemark==null) {
44 43
 			return new ReturnT<String>(500, "请输入备注");
@@ -46,31 +45,26 @@ public class JobCodeController {
46 45
 		if (glueRemark.length()<6 || glueRemark.length()>100) {
47 46
 			return new ReturnT<String>(500, "备注长度应该在6至100之间");
48 47
 		}
49
-		XxlJobInfo jobInfoOld = xxlJobInfoDao.load(jobGroup, jobName);
50
-		if (jobInfoOld == null) {
51
-			return new ReturnT<String>(500, "任务不存在");
48
+		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id);
49
+		if (exists_jobInfo == null) {
50
+			return new ReturnT<String>(500, "参数异常");
52 51
 		}
53 52
 		
54 53
 		// log old code
55 54
 		XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue();
56
-		xxlJobLogGlue.setJobGroup(jobInfoOld.getJobGroup());
57
-		xxlJobLogGlue.setJobName(jobInfoOld.getJobName());
58
-		xxlJobLogGlue.setGlueSource(jobInfoOld.getGlueSource());
59
-		xxlJobLogGlue.setGlueRemark(jobInfoOld.getGlueRemark());
60
-		
61
-		// init new code
62
-		jobInfoOld.setGlueSource(glueSource);
63
-		jobInfoOld.setGlueRemark(glueRemark);
64
-		
65
-		// update new code ,and log old code
66
-		xxlJobInfoDao.update(jobInfoOld);
67
-		if (StringUtils.isNotBlank(xxlJobLogGlue.getGlueSource()) && StringUtils.isNotBlank(xxlJobLogGlue.getGlueRemark())) {
68
-			xxlJobLogGlueDao.save(xxlJobLogGlue);
69
-			// remove code backup more than 30
70
-			xxlJobLogGlueDao.removeOld(xxlJobLogGlue.getJobGroup(), xxlJobLogGlue.getJobName(), 30);
71
-		}
72
-		
55
+		xxlJobLogGlue.setJobId(exists_jobInfo.getId());
56
+		xxlJobLogGlue.setGlueSource(exists_jobInfo.getGlueSource());
57
+		xxlJobLogGlue.setGlueRemark(exists_jobInfo.getGlueRemark());
58
+		xxlJobLogGlueDao.save(xxlJobLogGlue);
73 59
 		
60
+		// update new code
61
+		exists_jobInfo.setGlueSource(glueSource);
62
+		exists_jobInfo.setGlueRemark(glueRemark);
63
+		xxlJobInfoDao.update(exists_jobInfo);
64
+
65
+		// remove code backup more than 30
66
+		xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 3);
67
+
74 68
 		return ReturnT.SUCCESS;
75 69
 	}
76 70
 	

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

@@ -1,6 +1,8 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4
+import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
4 6
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
5 7
 import com.xxl.job.admin.service.IXxlJobService;
6 8
 import com.xxl.job.core.biz.model.ReturnT;
@@ -30,9 +32,11 @@ public class JobInfoController {
30 32
 	@RequestMapping
31 33
 	public String index(Model model) {
32 34
 
35
+		// 路由策略-列表
36
+		model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values());
37
+
33 38
 		// 任务组
34 39
 		List<XxlJobGroup> jobGroupList =  xxlJobGroupDao.findAll();
35
-
36 40
 		model.addAttribute("JobGroupList", jobGroupList);
37 41
 		return "jobinfo/jobinfo.index";
38 42
 	}
@@ -48,21 +52,14 @@ public class JobInfoController {
48 52
 	
49 53
 	@RequestMapping("/add")
50 54
 	@ResponseBody
51
-	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
52
-							   String executorHandler, String executorParam, int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
53
-		
54
-		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
55
-				executorHandler, executorParam,
56
-				glueSwitch, glueSource, glueRemark, childJobKey);
55
+	public ReturnT<String> add(XxlJobInfo jobInfo) {
56
+		return xxlJobService.add(jobInfo);
57 57
 	}
58 58
 	
59 59
 	@RequestMapping("/reschedule")
60 60
 	@ResponseBody
61
-	public ReturnT<String> reschedule(int jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
62
-			String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
63
-
64
-		return xxlJobService.reschedule(jobGroup, jobName, jobCron, jobDesc, author, alarmEmail,
65
-				executorHandler, executorParam, glueSwitch, childJobKey);
61
+	public ReturnT<String> reschedule(XxlJobInfo jobInfo) {
62
+		return xxlJobService.reschedule(jobInfo);
66 63
 	}
67 64
 	
68 65
 	@RequestMapping("/remove")

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

@@ -7,63 +7,69 @@ package com.xxl.job.admin.core.model;
7 7
 public class XxlJobLogGlue {
8 8
 	
9 9
 	private int id;
10
-	
11
-	private int jobGroup;
12
-	private String jobName;
13
-	
10
+	private int jobId;
14 11
 	private String glueSource;
15 12
 	private String glueRemark;
16 13
 	private String addTime;
17 14
 	private String updateTime;
18
-	
15
+
19 16
 	public int getId() {
20 17
 		return id;
21 18
 	}
19
+
22 20
 	public void setId(int id) {
23 21
 		this.id = id;
24 22
 	}
25
-	public int getJobGroup() {
26
-		return jobGroup;
27
-	}
28
-	public void setJobGroup(int jobGroup) {
29
-		this.jobGroup = jobGroup;
30
-	}
31
-	public String getJobName() {
32
-		return jobName;
23
+
24
+	public int getJobId() {
25
+		return jobId;
33 26
 	}
34
-	public void setJobName(String jobName) {
35
-		this.jobName = jobName;
27
+
28
+	public void setJobId(int jobId) {
29
+		this.jobId = jobId;
36 30
 	}
31
+
37 32
 	public String getGlueSource() {
38 33
 		return glueSource;
39 34
 	}
35
+
40 36
 	public void setGlueSource(String glueSource) {
41 37
 		this.glueSource = glueSource;
42 38
 	}
39
+
43 40
 	public String getGlueRemark() {
44 41
 		return glueRemark;
45 42
 	}
43
+
46 44
 	public void setGlueRemark(String glueRemark) {
47 45
 		this.glueRemark = glueRemark;
48 46
 	}
47
+
49 48
 	public String getAddTime() {
50 49
 		return addTime;
51 50
 	}
51
+
52 52
 	public void setAddTime(String addTime) {
53 53
 		this.addTime = addTime;
54 54
 	}
55
+
55 56
 	public String getUpdateTime() {
56 57
 		return updateTime;
57 58
 	}
59
+
58 60
 	public void setUpdateTime(String updateTime) {
59 61
 		this.updateTime = updateTime;
60 62
 	}
61
-	
63
+
62 64
 	@Override
63 65
 	public String toString() {
64
-		return "XxlJobLogGlue [id=" + id + ", jobGroup=" + jobGroup + ", jobName=" + jobName + ", glueSource="
65
-				+ glueSource + ", glueRemark=" + glueRemark + ", addTime=" + addTime + ", updateTime=" + updateTime
66
-				+ "]";
66
+		return "XxlJobLogGlue{" +
67
+				"id=" + id +
68
+				", jobId=" + jobId +
69
+				", glueSource='" + glueSource + '\'' +
70
+				", glueRemark='" + glueRemark + '\'' +
71
+				", addTime='" + addTime + '\'' +
72
+				", updateTime='" + updateTime + '\'' +
73
+				'}';
67 74
 	}
68
-	
69 75
 }

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

@@ -32,9 +32,11 @@ public enum ExecutorRouteStrategyEnum {
32 32
     }
33 33
 
34 34
     public static ExecutorRouteStrategyEnum match(String name, ExecutorRouteStrategyEnum defaultItem){
35
-        for (ExecutorRouteStrategyEnum item: ExecutorRouteStrategyEnum.values()) {
36
-            if (item.name().equals(name)) {
37
-                return item;
35
+        if (name != null) {
36
+            for (ExecutorRouteStrategyEnum item: ExecutorRouteStrategyEnum.values()) {
37
+                if (item.name().equals(name)) {
38
+                    return item;
39
+                }
38 40
             }
39 41
         }
40 42
         return defaultItem;

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

@@ -16,7 +16,8 @@ public interface IXxlJobInfoDao {
16 16
 	public int pageListCount(int offset, int pagesize, int jobGroup, String executorHandler);
17 17
 	
18 18
 	public int save(XxlJobInfo info);
19
-	
19
+
20
+	public XxlJobInfo loadById(int id);
20 21
 	public XxlJobInfo load(int jobGroup, String jobName);
21 22
 	
22 23
 	public int update(XxlJobInfo item);

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

@@ -12,10 +12,10 @@ public interface IXxlJobLogGlueDao {
12 12
 	
13 13
 	public int save(XxlJobLogGlue xxlJobLogGlue);
14 14
 	
15
-	public List<XxlJobLogGlue> selectList(int jobGroup, String jobName);
15
+	public List<XxlJobLogGlue> findByJobId(int jobId);
16 16
 
17
-	public int removeOld(int jobGroup, String jobName, int limit);
17
+	public int removeOld(int jobId, int limit);
18 18
 
19
-	public int delete(int jobGroup, String jobName);
19
+	public int deleteByJobId(int jobId);
20 20
 	
21 21
 }

+ 5 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java Прегледај датотеку

@@ -48,6 +48,11 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
48 48
 	}
49 49
 
50 50
 	@Override
51
+	public XxlJobInfo loadById(int id) {
52
+		return sqlSessionTemplate.selectOne("XxlJobInfoMapper.loadById", id);
53
+	}
54
+
55
+	@Override
51 56
 	public XxlJobInfo load(int jobGroup, String jobName) {
52 57
 		HashMap<String, Object> params = new HashMap<String, Object>();
53 58
 		params.put("jobGroup", jobGroup);

+ 6 - 13
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogGlueDaoImpl.java Прегледај датотеку

@@ -25,28 +25,21 @@ public class XxlJobLogGlueDaoImpl implements IXxlJobLogGlueDao {
25 25
 	}
26 26
 
27 27
 	@Override
28
-	public List<XxlJobLogGlue> selectList(int jobGroup, String jobName) {
29
-		HashMap<String, Object> params = new HashMap<String, Object>();
30
-		params.put("jobGroup", jobGroup);
31
-		params.put("jobName", jobName);
32
-		return sqlSessionTemplate.selectList("XxlJobLogGlueMapper.selectList", params);
28
+	public List<XxlJobLogGlue> findByJobId(int jobId) {
29
+		return sqlSessionTemplate.selectList("XxlJobLogGlueMapper.findByJobId", jobId);
33 30
 	}
34 31
 
35 32
 	@Override
36
-	public int removeOld(int jobGroup, String jobName, int limit) {
33
+	public int removeOld(int jobId, int limit) {
37 34
 		HashMap<String, Object> params = new HashMap<String, Object>();
38
-		params.put("jobGroup", jobGroup);
39
-		params.put("jobName", jobName);
35
+		params.put("jobId", jobId);
40 36
 		params.put("limit", limit);
41 37
 		return sqlSessionTemplate.delete("XxlJobLogGlueMapper.removeOld", params);
42 38
 	}
43 39
 
44 40
 	@Override
45
-	public int delete(int jobGroup, String jobName) {
46
-		HashMap<String, Object> params = new HashMap<String, Object>();
47
-		params.put("jobGroup", jobGroup);
48
-		params.put("jobName", jobName);
49
-		return sqlSessionTemplate.delete("XxlJobLogGlueMapper.delete", params);
41
+	public int deleteByJobId(int jobId) {
42
+		return sqlSessionTemplate.delete("XxlJobLogGlueMapper.deleteByJobId", jobId);
50 43
 	}
51 44
 	
52 45
 }

+ 3 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java Прегледај датотеку

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

+ 48 - 43
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Прегледај датотеку

@@ -2,6 +2,7 @@ package com.xxl.job.admin.service.impl;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
5 6
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
6 7
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7 8
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
@@ -64,33 +65,34 @@ public class XxlJobServiceImpl implements IXxlJobService {
64 65
 	}
65 66
 
66 67
 	@Override
67
-	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
68
-							   String executorHandler, String executorParam,
69
-							   int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
68
+	public ReturnT<String> add(XxlJobInfo jobInfo) {
70 69
 		// valid
71
-		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
70
+		XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
72 71
 		if (group == null) {
73 72
 			return new ReturnT<String>(500, "请选择“执行器”");
74 73
 		}
75
-		if (!CronExpression.isValidExpression(jobCron)) {
74
+		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
76 75
 			return new ReturnT<String>(500, "请输入格式正确的“Cron”");
77 76
 		}
78
-		if (StringUtils.isBlank(jobDesc)) {
77
+		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
79 78
 			return new ReturnT<String>(500, "请输入“任务描述”");
80 79
 		}
81
-		if (StringUtils.isBlank(author)) {
80
+		if (StringUtils.isBlank(jobInfo.getAuthor())) {
82 81
 			return new ReturnT<String>(500, "请输入“负责人”");
83 82
 		}
84
-		if (StringUtils.isBlank(alarmEmail)) {
83
+		if (StringUtils.isBlank(jobInfo.getAlarmEmail())) {
85 84
 			return new ReturnT<String>(500, "请输入“报警邮件”");
86 85
 		}
87
-		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
86
+		if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
87
+			return new ReturnT<String>(500, "路由策略非法");
88
+		}
89
+		if (jobInfo.getGlueSwitch()==0 && StringUtils.isBlank(jobInfo.getExecutorHandler())) {
88 90
 			return new ReturnT<String>(500, "请输入“JobHandler”");
89 91
 		}
90 92
 
91 93
 		// childJobKey valid
92
-		if (StringUtils.isNotBlank(childJobKey)) {
93
-			String[] childJobKeys = childJobKey.split(",");
94
+		if (StringUtils.isNotBlank(jobInfo.getChildJobKey())) {
95
+			String[] childJobKeys = jobInfo.getChildJobKey().split(",");
94 96
 			for (String childJobKeyItem: childJobKeys) {
95 97
 				String[] childJobKeyArr = childJobKeyItem.split("_");
96 98
 				if (childJobKeyArr.length!=2) {
@@ -105,8 +107,9 @@ public class XxlJobServiceImpl implements IXxlJobService {
105 107
 
106 108
 		// generate jobName
107 109
 		String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
110
+		jobInfo.setJobName(jobName);
108 111
 		try {
109
-			if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobGroup))) {
112
+			if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobInfo.getJobGroup()))) {
110 113
 				return new ReturnT<String>(500, "系统繁忙,请稍后重试");
111 114
 			}
112 115
 		} catch (SchedulerException e1) {
@@ -115,7 +118,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
115 118
 		}
116 119
 
117 120
 		// Backup to the database
118
-		XxlJobInfo jobInfo = new XxlJobInfo();
121
+		/*XxlJobInfo jobInfo = new XxlJobInfo();
119 122
 		jobInfo.setJobGroup(jobGroup);
120 123
 		jobInfo.setJobName(jobName);
121 124
 		jobInfo.setJobCron(jobCron);
@@ -127,11 +130,11 @@ public class XxlJobServiceImpl implements IXxlJobService {
127 130
 		jobInfo.setGlueSwitch(glueSwitch);
128 131
 		jobInfo.setGlueSource(glueSource);
129 132
 		jobInfo.setGlueRemark(glueRemark);
130
-		jobInfo.setChildJobKey(childJobKey);
133
+		jobInfo.setChildJobKey(childJobKey);*/
131 134
 
132 135
 		try {
133 136
 			// add job 2 quartz
134
-			boolean result = XxlJobDynamicScheduler.addJob(String.valueOf(jobGroup), jobName, jobCron);
137
+			boolean result = XxlJobDynamicScheduler.addJob(String.valueOf(jobInfo.getJobGroup()), jobName, jobInfo.getJobCron());
135 138
 			if (result) {
136 139
 				xxlJobInfoDao.save(jobInfo);
137 140
 				return ReturnT.SUCCESS;
@@ -145,36 +148,31 @@ public class XxlJobServiceImpl implements IXxlJobService {
145 148
 	}
146 149
 
147 150
 	@Override
148
-	public ReturnT<String> reschedule(int jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
149
-			String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
151
+	public ReturnT<String> reschedule(XxlJobInfo jobInfo) {
150 152
 
151 153
 		// valid
152
-		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
153
-		if (group == null) {
154
-			return new ReturnT<String>(500, "请选择“执行器”");
155
-		}
156
-		if (StringUtils.isBlank(jobName)) {
157
-			return new ReturnT<String>(500, "请输入“任务名”");
158
-		}
159
-		if (!CronExpression.isValidExpression(jobCron)) {
154
+		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
160 155
 			return new ReturnT<String>(500, "请输入格式正确的“Cron”");
161 156
 		}
162
-		if (StringUtils.isBlank(jobDesc)) {
157
+		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
163 158
 			return new ReturnT<String>(500, "请输入“任务描述”");
164 159
 		}
165
-		if (StringUtils.isBlank(author)) {
160
+		if (StringUtils.isBlank(jobInfo.getAuthor())) {
166 161
 			return new ReturnT<String>(500, "请输入“负责人”");
167 162
 		}
168
-		if (StringUtils.isBlank(alarmEmail)) {
163
+		if (StringUtils.isBlank(jobInfo.getAlarmEmail())) {
169 164
 			return new ReturnT<String>(500, "请输入“报警邮件”");
170 165
 		}
171
-		if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
166
+		if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
167
+			return new ReturnT<String>(500, "路由策略非法");
168
+		}
169
+		if (jobInfo.getGlueSwitch()==0 && StringUtils.isBlank(jobInfo.getExecutorHandler())) {
172 170
 			return new ReturnT<String>(500, "请输入“JobHandler”");
173 171
 		}
174 172
 
175 173
 		// childJobKey valid
176
-		if (StringUtils.isNotBlank(childJobKey)) {
177
-			String[] childJobKeys = childJobKey.split(",");
174
+		if (StringUtils.isNotBlank(jobInfo.getChildJobKey())) {
175
+			String[] childJobKeys = jobInfo.getChildJobKey().split(",");
178 176
 			for (String childJobKeyItem: childJobKeys) {
179 177
 				String[] childJobKeyArr = childJobKeyItem.split("_");
180 178
 				if (childJobKeyArr.length!=2) {
@@ -188,21 +186,26 @@ public class XxlJobServiceImpl implements IXxlJobService {
188 186
 		}
189 187
 
190 188
 		// stage job info
191
-		XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
192
-		jobInfo.setJobCron(jobCron);
193
-		jobInfo.setJobDesc(jobDesc);
194
-		jobInfo.setAuthor(author);
195
-		jobInfo.setAlarmEmail(alarmEmail);
196
-		jobInfo.setExecutorHandler(executorHandler);
197
-		jobInfo.setExecutorParam(executorParam);
198
-		jobInfo.setGlueSwitch(glueSwitch);
199
-		jobInfo.setChildJobKey(childJobKey);
189
+		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
190
+		if (exists_jobInfo == null) {
191
+			return new ReturnT<String>(500, "参数异常");
192
+		}
193
+
194
+		exists_jobInfo.setJobCron(jobInfo.getJobCron());
195
+		exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
196
+		exists_jobInfo.setAuthor(jobInfo.getAuthor());
197
+		exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail());
198
+		exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy());
199
+		exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());
200
+		exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());
201
+		exists_jobInfo.setGlueSwitch(jobInfo.getGlueSwitch());
202
+		exists_jobInfo.setChildJobKey(jobInfo.getChildJobKey());
200 203
 		
201 204
 		try {
202 205
 			// fresh quartz
203
-			boolean ret = XxlJobDynamicScheduler.rescheduleJob(String.valueOf(jobGroup), jobName, jobCron);
206
+			boolean ret = XxlJobDynamicScheduler.rescheduleJob(String.valueOf(exists_jobInfo.getJobGroup()), exists_jobInfo.getJobName(), exists_jobInfo.getJobCron());
204 207
 			if (ret) {
205
-				xxlJobInfoDao.update(jobInfo);
208
+				xxlJobInfoDao.update(exists_jobInfo);
206 209
 				return ReturnT.SUCCESS;
207 210
 			} else {
208 211
 				return new ReturnT<String>(500, "更新任务失败");
@@ -215,11 +218,13 @@ public class XxlJobServiceImpl implements IXxlJobService {
215 218
 
216 219
 	@Override
217 220
 	public ReturnT<String> remove(int jobGroup, String jobName) {
221
+		XxlJobInfo xxlJobInfo = xxlJobInfoDao.load(jobGroup, jobName);
222
+
218 223
 		try {
219 224
 			XxlJobDynamicScheduler.removeJob(jobName, String.valueOf(jobGroup));
220 225
 			xxlJobInfoDao.delete(jobGroup, jobName);
221 226
 			xxlJobLogDao.delete(jobGroup, jobName);
222
-			xxlJobLogGlueDao.delete(jobGroup, jobName);
227
+			xxlJobLogGlueDao.deleteByJobId(xxlJobInfo.getId());
223 228
 			return ReturnT.SUCCESS;
224 229
 		} catch (SchedulerException e) {
225 230
 			e.printStackTrace();

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

@@ -113,7 +113,13 @@
113 113
 			SELECT LAST_INSERT_ID() 
114 114
 		</selectKey> 
115 115
 	</insert>
116
-	
116
+
117
+	<select id="loadById" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
118
+		SELECT <include refid="Base_Column_List" />
119
+		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
120
+		WHERE t.id = #{id}
121
+	</select>
122
+
117 123
 	<select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
118 124
 		SELECT <include refid="Base_Column_List" />
119 125
 		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t

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

@@ -5,8 +5,7 @@
5 5
 	
6 6
 	<resultMap id="XxlJobLogGlue" type="com.xxl.job.admin.core.model.XxlJobLogGlue" >
7 7
 		<result column="id" property="id" />
8
-	    <result column="job_group" property="jobGroup" />
9
-	    <result column="job_name" property="jobName" />
8
+	    <result column="job_id" property="jobId" />
10 9
 	    <result column="glue_source" property="glueSource" />
11 10
 	    <result column="glue_remark" property="glueRemark" />
12 11
 	    <result column="add_time" property="addTime" />
@@ -15,8 +14,7 @@
15 14
 
16 15
 	<sql id="Base_Column_List">
17 16
 		t.id,
18
-		t.job_group,
19
-		t.job_name,
17
+		t.job_id,
20 18
 		t.glue_source,
21 19
 		t.glue_remark,
22 20
 		t.add_time,
@@ -25,15 +23,13 @@
25 23
 	
26 24
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
27 25
 		INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOGGLUE (
28
-			`job_group`,
29
-			`job_name`,
30
-			`glue_source`, 
26
+			`job_id`,
27
+			`glue_source`,
31 28
 			`glue_remark`,
32 29
 			`add_time`, 
33 30
 			`update_time`
34 31
 		) VALUES (
35
-			#{jobGroup}, 
36
-			#{jobName},
32
+			#{jobId},
37 33
 			#{glueSource},
38 34
 			#{glueRemark},
39 35
 			now(),
@@ -44,17 +40,10 @@
44 40
 		</selectKey> 
45 41
 	</insert>
46 42
 	
47
-	<select id="selectList" parameterType="java.util.HashMap" resultMap="XxlJobLogGlue">
43
+	<select id="findByJobId" parameterType="java.lang.Integer" resultMap="XxlJobLogGlue">
48 44
 		SELECT <include refid="Base_Column_List" />
49 45
 		FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE AS t
50
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
51
-			<if test="jobGroup gt 0">
52
-				AND t.job_group = #{jobGroup}
53
-			</if>
54
-			<if test="jobName != null and jobName != ''">
55
-				AND t.job_name = #{jobName}
56
-			</if>
57
-		</trim>
46
+		WHERE t.job_id = #{jobId}
58 47
 		ORDER BY id DESC
59 48
 	</select>
60 49
 	
@@ -63,16 +52,16 @@
63 52
 		WHERE id NOT in(
64 53
 			SELECT id FROM(
65 54
 				SELECT id FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
66
-				WHERE `job_group` = #{jobGroup} and `job_name` = #{jobName}
55
+				WHERE `job_id` = #{jobId}
67 56
 				ORDER BY update_time desc
68 57
 				LIMIT 0, #{limit}
69 58
 			) t1
70
-		) AND `job_group` = #{jobGroup} and `job_name` = #{jobName}
59
+		) AND `job_id` = #{jobId}
71 60
 	</delete>
72 61
 	
73
-	<delete id="delete" parameterType="java.util.HashMap" >
62
+	<delete id="deleteByJobId" parameterType="java.lang.Integer" >
74 63
 		DELETE FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
75
-		WHERE job_group = #{jobGroup} and job_name = #{jobName}
64
+		WHERE `job_id` = #{jobId}
76 65
 	</delete>
77 66
 	
78 67
 </mapper>

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

@@ -94,8 +94,7 @@
94 94
 <script src="${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.js"></script>
95 95
 <script src="${request.contextPath}/static/plugins/codemirror/addon/hint/anyword-hint.js"></script>
96 96
 <script>
97
-var jobGroup = '${jobInfo.jobGroup}';
98
-var jobName = '${jobInfo.jobName}';
97
+var id = '${jobInfo.id}';
99 98
 </script>
100 99
 <script src="${request.contextPath}/static/js/jobcode.index.1.js"></script>
101 100
 

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

@@ -124,23 +124,29 @@
124 124
                         <label for="lastname" class="col-sm-2 control-label">任务描述<font color="red">*</font></label>
125 125
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
126 126
 					</div>
127
-					<div class="form-group">
127
+                    <div class="form-group">
128
+                        <label for="firstname" class="col-sm-2 control-label">路由策略<font color="red">*</font></label>
129
+                        <div class="col-sm-4">
130
+                            <select class="form-control" name="executorRouteStrategy" >
131
+							<#list ExecutorRouteStrategyEnum as item>
132
+                                <option value="${item}" >${item.title}</option>
133
+							</#list>
134
+                            </select>
135
+                        </div>
136
+                        <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
137
+                        <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
138
+                    </div>
139
+                    <div class="form-group">
128 140
                         <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
129 141
                         <div class="col-sm-4">
130 142
                             <div class="input-group">
131
-								<input type="text" class="form-control" name="executorHandler" placeholder="请输入“JobHandler”" maxlength="100" >
132
-								<span class="input-group-addon"><b>GLUE</b>&nbsp;<input type="checkbox" class="ifGLUE" ></span>
143
+                                <input type="text" class="form-control" name="executorHandler" placeholder="请输入“JobHandler”" maxlength="100" >
144
+                                <span class="input-group-addon"><b>GLUE</b>&nbsp;<input type="checkbox" class="ifGLUE" ></span>
133 145
                                 <input type="hidden" name="glueSwitch" value="0" >
134 146
                             </div>
135
-						</div>
136
-						<label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
147
+                        </div>
148
+                        <label for="firstname" class="col-sm-2 control-label">执行参数<font color="black">*</font></label>
137 149
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
138
-					</div>
139
-                    <div class="form-group">
140
-                        <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
141
-                        <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
142
-                        <label for="lastname" class="col-sm-2 control-label">子任务Key<font color="black">*</font></label>
143
-                        <div class="col-sm-4"><input type="text" class="form-control" name="childJobKey" placeholder="请输入子任务的任务Key,如存在多个逗号分隔" maxlength="100" ></div>
144 150
                     </div>
145 151
 					<div class="form-group">
146 152
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
@@ -148,6 +154,10 @@
148 154
                         <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
149 155
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
150 156
 					</div>
157
+                    <div class="form-group">
158
+                        <label for="lastname" class="col-sm-2 control-label">子任务Key<font color="black">*</font></label>
159
+                        <div class="col-sm-4"><input type="text" class="form-control" name="childJobKey" placeholder="请输入子任务的任务Key,如存在多个逗号分隔" maxlength="100" ></div>
160
+                    </div>
151 161
                     <hr>
152 162
 					<div class="form-group">
153 163
 						<div class="col-sm-offset-3 col-sm-6">
@@ -191,14 +201,30 @@ public class DemoGlueJobHandler extends IJobHandler {
191 201
          	</div>
192 202
          	<div class="modal-body">
193 203
 				<form class="form-horizontal form" role="form" >
194
-					<div class="form-group">
204
+                    <div class="form-group">
195 205
                         <label for="firstname" class="col-sm-2 control-label">执行器<font color="red">*</font></label>
196 206
                         <div class="col-sm-4">
197
-							<input type="text" class="form-control jobGroupTitle" maxlength="50" readonly >
198
-						</div>
207
+                            <select class="form-control" name="jobGroup" disabled >
208
+							<#list JobGroupList as group>
209
+                                <option value="${group.id}" >${group.title}</option>
210
+							</#list>
211
+                            </select>
212
+                        </div>
199 213
                         <label for="lastname" class="col-sm-2 control-label">任务描述<font color="red">*</font></label>
200 214
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
201
-					</div>
215
+                    </div>
216
+                    <div class="form-group">
217
+                        <label for="firstname" class="col-sm-2 control-label">路由策略<font color="red">*</font></label>
218
+                        <div class="col-sm-4">
219
+                            <select class="form-control" name="executorRouteStrategy" >
220
+							<#list ExecutorRouteStrategyEnum as item>
221
+                                <option value="${item}" >${item.title}</option>
222
+							</#list>
223
+                            </select>
224
+                        </div>
225
+                        <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
226
+                        <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
227
+                    </div>
202 228
                     <div class="form-group">
203 229
                         <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
204 230
                         <div class="col-sm-4">
@@ -212,24 +238,21 @@ public class DemoGlueJobHandler extends IJobHandler {
212 238
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
213 239
                     </div>
214 240
                     <div class="form-group">
215
-                        <label for="lastname" class="col-sm-2 control-label">Cron<font color="red">*</font></label>
216
-                        <div class="col-sm-4"><input type="text" class="form-control" name="jobCron" placeholder="请输入“Cron”" maxlength="20" ></div>
241
+                        <label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
242
+                        <div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="请输入“报警邮件”,多个邮件地址逗号分隔" maxlength="100" ></div>
243
+                        <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
244
+                        <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
245
+                    </div>
246
+                    <div class="form-group">
217 247
                         <label for="lastname" class="col-sm-2 control-label">子任务Key<font color="black">*</font></label>
218 248
                         <div class="col-sm-4"><input type="text" class="form-control" name="childJobKey" placeholder="请输入子任务的任务Key,如存在多个逗号分隔" maxlength="100" ></div>
219 249
                     </div>
220
-					<div class="form-group">
221
-						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
222
-						<div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="请输入“报警邮件”,多个邮件地址逗号分隔" maxlength="100" ></div>
223
-                        <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
224
-                        <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
225
-					</div>
226 250
 					<hr>
227 251
 					<div class="form-group">
228 252
                         <div class="col-sm-offset-3 col-sm-6">
229 253
 							<button type="submit" class="btn btn-primary"  >保存</button>
230 254
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
231
-                            <input type="hidden" name="jobGroup" >
232
-                            <input type="hidden" name="jobName" >
255
+                            <input type="hidden" name="id" >
233 256
 						</div>
234 257
 					</div>
235 258
 				</form>

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

@@ -37,8 +37,7 @@ $(function() {
37 37
 				type : 'POST',
38 38
 				url : base_url + '/jobcode/save',
39 39
 				data : {
40
-					'jobGroup' : jobGroup,
41
-					'jobName' : jobName,
40
+					'id' : id,
42 41
 					'glueSource' : glueSource,
43 42
 					'glueRemark' : glueRemark
44 43
 				},

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

@@ -100,7 +100,7 @@ $(function() {
100 100
 	                			// log url
101 101
 	                			var codeBtn = "";
102 102
 	                			if(row.glueSwitch > 0){
103
-									var codeUrl = base_url +'/jobcode?jobGroup='+ row.jobGroup +'&jobName='+ row.jobName;
103
+									var codeUrl = base_url +'/jobcode?jobId='+ row.id;
104 104
 									codeBtn = '<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(\'' + codeUrl + '\')" >GLUE</button>  '
105 105
 								}
106 106
 
@@ -112,6 +112,7 @@ $(function() {
112 112
 									' jobDesc="'+ row.jobDesc +'" '+
113 113
 									' author="'+ row.author +'" '+
114 114
 									' alarmEmail="'+ row.alarmEmail +'" '+
115
+									' executorRouteStrategy="'+row.executorRouteStrategy +'" '+
115 116
 									' executorHandler="'+row.executorHandler +'" '+
116 117
 									' executorParam="'+ row.executorParam +'" '+
117 118
 									' glueSwitch="'+ row.glueSwitch +'" '+
@@ -323,20 +324,17 @@ $(function() {
323 324
 	$("#job_list").on('click', '.update',function() {
324 325
 
325 326
 		// base data
326
-		$("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup"));
327
-		$("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName"));
327
+		$("#updateModal .form input[name='id']").val($(this).parent('p').attr("id"));
328
+		$('#updateModal .form select[name=jobGroup] option[value='+ $(this).parent('p').attr("jobGroup") +']').prop('selected', true);
328 329
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
329 330
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
330 331
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
331 332
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
333
+		$('#updateModal .form select[name=executorRouteStrategy] option[value='+ $(this).parent('p').attr("executorRouteStrategy") +']').prop('selected', true);
332 334
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
333 335
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
334 336
         $("#updateModal .form input[name='childJobKey']").val($(this).parent('p').attr("childJobKey"));
335 337
 
336
-		// jobGroupTitle
337
-		var jobGroupTitle = $("#addModal .form select[name='jobGroup']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").text();
338
-		$("#updateModal .form .jobGroupTitle").val(jobGroupTitle);
339
-
340 338
         // glueSwitch
341 339
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
342 340
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);