Преглед на файлове

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

xueli.xue преди 8 години
родител
ревизия
f3573c8643
променени са 17 файла, в които са добавени 201 реда и са изтрити 185 реда
  1. 2 2
      README.md
  2. 19 25
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
  3. 9 12
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
  4. 26 20
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
  5. 5 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java
  6. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java
  7. 3 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogGlueDao.java
  8. 5 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java
  9. 6 13
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogGlueDaoImpl.java
  10. 3 4
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java
  11. 48 43
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
  12. 7 1
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
  13. 11 22
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml
  14. 1 2
      xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl
  15. 48 25
      xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
  16. 1 2
      xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js
  17. 5 7
      xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js

+ 2 - 2
README.md Целия файл

88
 ![输入图片说明](https://static.oschina.net/uploads/img/201703/07162326_L3VB.png "在这里输入图片标题")
88
 ![输入图片说明](https://static.oschina.net/uploads/img/201703/07162326_L3VB.png "在这里输入图片标题")
89
 
89
 
90
 #### 1.5 环境
90
 #### 1.5 环境
91
+- Servlet/JSP Spec:3.0/2.2
91
 - JDK:1.7+
92
 - JDK:1.7+
92
-- Tomcat:7+
93
+- Tomcat:7+/Jetty8+
93
 - Mysql:5.6+
94
 - Mysql:5.6+
94
-- Servlet/JSP Spec:3.0/2.2
95
 - Maven:3+
95
 - Maven:3+
96
 
96
 
97
 
97
 

+ 19 - 25
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java Целия файл

5
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
5
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
6
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
6
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
7
 import com.xxl.job.core.biz.model.ReturnT;
7
 import com.xxl.job.core.biz.model.ReturnT;
8
-import org.apache.commons.lang.StringUtils;
9
 import org.springframework.stereotype.Controller;
8
 import org.springframework.stereotype.Controller;
10
 import org.springframework.ui.Model;
9
 import org.springframework.ui.Model;
11
 import org.springframework.web.bind.annotation.RequestMapping;
10
 import org.springframework.web.bind.annotation.RequestMapping;
28
 	private IXxlJobLogGlueDao xxlJobLogGlueDao;
27
 	private IXxlJobLogGlueDao xxlJobLogGlueDao;
29
 
28
 
30
 	@RequestMapping
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
 		model.addAttribute("jobInfo", jobInfo);
33
 		model.addAttribute("jobInfo", jobInfo);
35
 		model.addAttribute("jobLogGlues", jobLogGlues);
34
 		model.addAttribute("jobLogGlues", jobLogGlues);
36
 		return "jobcode/jobcode.index";
35
 		return "jobcode/jobcode.index";
38
 	
37
 	
39
 	@RequestMapping("/save")
38
 	@RequestMapping("/save")
40
 	@ResponseBody
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
 		// valid
41
 		// valid
43
 		if (glueRemark==null) {
42
 		if (glueRemark==null) {
44
 			return new ReturnT<String>(500, "请输入备注");
43
 			return new ReturnT<String>(500, "请输入备注");
46
 		if (glueRemark.length()<6 || glueRemark.length()>100) {
45
 		if (glueRemark.length()<6 || glueRemark.length()>100) {
47
 			return new ReturnT<String>(500, "备注长度应该在6至100之间");
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
 		// log old code
53
 		// log old code
55
 		XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue();
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
 		return ReturnT.SUCCESS;
68
 		return ReturnT.SUCCESS;
75
 	}
69
 	}
76
 	
70
 	

+ 9 - 12
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java Целия файл

1
 package com.xxl.job.admin.controller;
1
 package com.xxl.job.admin.controller;
2
 
2
 
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
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
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
6
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
5
 import com.xxl.job.admin.service.IXxlJobService;
7
 import com.xxl.job.admin.service.IXxlJobService;
6
 import com.xxl.job.core.biz.model.ReturnT;
8
 import com.xxl.job.core.biz.model.ReturnT;
30
 	@RequestMapping
32
 	@RequestMapping
31
 	public String index(Model model) {
33
 	public String index(Model model) {
32
 
34
 
35
+		// 路由策略-列表
36
+		model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values());
37
+
33
 		// 任务组
38
 		// 任务组
34
 		List<XxlJobGroup> jobGroupList =  xxlJobGroupDao.findAll();
39
 		List<XxlJobGroup> jobGroupList =  xxlJobGroupDao.findAll();
35
-
36
 		model.addAttribute("JobGroupList", jobGroupList);
40
 		model.addAttribute("JobGroupList", jobGroupList);
37
 		return "jobinfo/jobinfo.index";
41
 		return "jobinfo/jobinfo.index";
38
 	}
42
 	}
48
 	
52
 	
49
 	@RequestMapping("/add")
53
 	@RequestMapping("/add")
50
 	@ResponseBody
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
 	@RequestMapping("/reschedule")
59
 	@RequestMapping("/reschedule")
60
 	@ResponseBody
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
 	@RequestMapping("/remove")
65
 	@RequestMapping("/remove")

+ 26 - 20
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java Целия файл

7
 public class XxlJobLogGlue {
7
 public class XxlJobLogGlue {
8
 	
8
 	
9
 	private int id;
9
 	private int id;
10
-	
11
-	private int jobGroup;
12
-	private String jobName;
13
-	
10
+	private int jobId;
14
 	private String glueSource;
11
 	private String glueSource;
15
 	private String glueRemark;
12
 	private String glueRemark;
16
 	private String addTime;
13
 	private String addTime;
17
 	private String updateTime;
14
 	private String updateTime;
18
-	
15
+
19
 	public int getId() {
16
 	public int getId() {
20
 		return id;
17
 		return id;
21
 	}
18
 	}
19
+
22
 	public void setId(int id) {
20
 	public void setId(int id) {
23
 		this.id = id;
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
 	public String getGlueSource() {
32
 	public String getGlueSource() {
38
 		return glueSource;
33
 		return glueSource;
39
 	}
34
 	}
35
+
40
 	public void setGlueSource(String glueSource) {
36
 	public void setGlueSource(String glueSource) {
41
 		this.glueSource = glueSource;
37
 		this.glueSource = glueSource;
42
 	}
38
 	}
39
+
43
 	public String getGlueRemark() {
40
 	public String getGlueRemark() {
44
 		return glueRemark;
41
 		return glueRemark;
45
 	}
42
 	}
43
+
46
 	public void setGlueRemark(String glueRemark) {
44
 	public void setGlueRemark(String glueRemark) {
47
 		this.glueRemark = glueRemark;
45
 		this.glueRemark = glueRemark;
48
 	}
46
 	}
47
+
49
 	public String getAddTime() {
48
 	public String getAddTime() {
50
 		return addTime;
49
 		return addTime;
51
 	}
50
 	}
51
+
52
 	public void setAddTime(String addTime) {
52
 	public void setAddTime(String addTime) {
53
 		this.addTime = addTime;
53
 		this.addTime = addTime;
54
 	}
54
 	}
55
+
55
 	public String getUpdateTime() {
56
 	public String getUpdateTime() {
56
 		return updateTime;
57
 		return updateTime;
57
 	}
58
 	}
59
+
58
 	public void setUpdateTime(String updateTime) {
60
 	public void setUpdateTime(String updateTime) {
59
 		this.updateTime = updateTime;
61
 		this.updateTime = updateTime;
60
 	}
62
 	}
61
-	
63
+
62
 	@Override
64
 	@Override
63
 	public String toString() {
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
     }
32
     }
33
 
33
 
34
     public static ExecutorRouteStrategyEnum match(String name, ExecutorRouteStrategyEnum defaultItem){
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
         return defaultItem;
42
         return defaultItem;

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java Целия файл

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

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogGlueDao.java Целия файл

12
 	
12
 	
13
 	public int save(XxlJobLogGlue xxlJobLogGlue);
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
 	}
48
 	}
49
 
49
 
50
 	@Override
50
 	@Override
51
+	public XxlJobInfo loadById(int id) {
52
+		return sqlSessionTemplate.selectOne("XxlJobInfoMapper.loadById", id);
53
+	}
54
+
55
+	@Override
51
 	public XxlJobInfo load(int jobGroup, String jobName) {
56
 	public XxlJobInfo load(int jobGroup, String jobName) {
52
 		HashMap<String, Object> params = new HashMap<String, Object>();
57
 		HashMap<String, Object> params = new HashMap<String, Object>();
53
 		params.put("jobGroup", jobGroup);
58
 		params.put("jobGroup", jobGroup);

+ 6 - 13
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogGlueDaoImpl.java Целия файл

25
 	}
25
 	}
26
 
26
 
27
 	@Override
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
 	@Override
32
 	@Override
36
-	public int removeOld(int jobGroup, String jobName, int limit) {
33
+	public int removeOld(int jobId, int limit) {
37
 		HashMap<String, Object> params = new HashMap<String, Object>();
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
 		params.put("limit", limit);
36
 		params.put("limit", limit);
41
 		return sqlSessionTemplate.delete("XxlJobLogGlueMapper.removeOld", params);
37
 		return sqlSessionTemplate.delete("XxlJobLogGlueMapper.removeOld", params);
42
 	}
38
 	}
43
 
39
 
44
 	@Override
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
 package com.xxl.job.admin.service;
1
 package com.xxl.job.admin.service;
2
 
2
 
3
 
3
 
4
+import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.core.biz.model.ReturnT;
5
 import com.xxl.job.core.biz.model.ReturnT;
5
 
6
 
6
 import java.util.Map;
7
 import java.util.Map;
14
 	
15
 	
15
 	public Map<String, Object> pageList(int start, int length, int jobGroup, String executorHandler, String filterTime);
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
 	public ReturnT<String> remove(int jobGroup, String jobName);
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
 
2
 
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
5
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
6
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
6
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
8
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
64
 	}
65
 	}
65
 
66
 
66
 	@Override
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
 		// valid
69
 		// valid
71
-		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
70
+		XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
72
 		if (group == null) {
71
 		if (group == null) {
73
 			return new ReturnT<String>(500, "请选择“执行器”");
72
 			return new ReturnT<String>(500, "请选择“执行器”");
74
 		}
73
 		}
75
-		if (!CronExpression.isValidExpression(jobCron)) {
74
+		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
76
 			return new ReturnT<String>(500, "请输入格式正确的“Cron”");
75
 			return new ReturnT<String>(500, "请输入格式正确的“Cron”");
77
 		}
76
 		}
78
-		if (StringUtils.isBlank(jobDesc)) {
77
+		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
79
 			return new ReturnT<String>(500, "请输入“任务描述”");
78
 			return new ReturnT<String>(500, "请输入“任务描述”");
80
 		}
79
 		}
81
-		if (StringUtils.isBlank(author)) {
80
+		if (StringUtils.isBlank(jobInfo.getAuthor())) {
82
 			return new ReturnT<String>(500, "请输入“负责人”");
81
 			return new ReturnT<String>(500, "请输入“负责人”");
83
 		}
82
 		}
84
-		if (StringUtils.isBlank(alarmEmail)) {
83
+		if (StringUtils.isBlank(jobInfo.getAlarmEmail())) {
85
 			return new ReturnT<String>(500, "请输入“报警邮件”");
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
 			return new ReturnT<String>(500, "请输入“JobHandler”");
90
 			return new ReturnT<String>(500, "请输入“JobHandler”");
89
 		}
91
 		}
90
 
92
 
91
 		// childJobKey valid
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
 			for (String childJobKeyItem: childJobKeys) {
96
 			for (String childJobKeyItem: childJobKeys) {
95
 				String[] childJobKeyArr = childJobKeyItem.split("_");
97
 				String[] childJobKeyArr = childJobKeyItem.split("_");
96
 				if (childJobKeyArr.length!=2) {
98
 				if (childJobKeyArr.length!=2) {
105
 
107
 
106
 		// generate jobName
108
 		// generate jobName
107
 		String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
109
 		String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
110
+		jobInfo.setJobName(jobName);
108
 		try {
111
 		try {
109
-			if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobGroup))) {
112
+			if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobInfo.getJobGroup()))) {
110
 				return new ReturnT<String>(500, "系统繁忙,请稍后重试");
113
 				return new ReturnT<String>(500, "系统繁忙,请稍后重试");
111
 			}
114
 			}
112
 		} catch (SchedulerException e1) {
115
 		} catch (SchedulerException e1) {
115
 		}
118
 		}
116
 
119
 
117
 		// Backup to the database
120
 		// Backup to the database
118
-		XxlJobInfo jobInfo = new XxlJobInfo();
121
+		/*XxlJobInfo jobInfo = new XxlJobInfo();
119
 		jobInfo.setJobGroup(jobGroup);
122
 		jobInfo.setJobGroup(jobGroup);
120
 		jobInfo.setJobName(jobName);
123
 		jobInfo.setJobName(jobName);
121
 		jobInfo.setJobCron(jobCron);
124
 		jobInfo.setJobCron(jobCron);
127
 		jobInfo.setGlueSwitch(glueSwitch);
130
 		jobInfo.setGlueSwitch(glueSwitch);
128
 		jobInfo.setGlueSource(glueSource);
131
 		jobInfo.setGlueSource(glueSource);
129
 		jobInfo.setGlueRemark(glueRemark);
132
 		jobInfo.setGlueRemark(glueRemark);
130
-		jobInfo.setChildJobKey(childJobKey);
133
+		jobInfo.setChildJobKey(childJobKey);*/
131
 
134
 
132
 		try {
135
 		try {
133
 			// add job 2 quartz
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
 			if (result) {
138
 			if (result) {
136
 				xxlJobInfoDao.save(jobInfo);
139
 				xxlJobInfoDao.save(jobInfo);
137
 				return ReturnT.SUCCESS;
140
 				return ReturnT.SUCCESS;
145
 	}
148
 	}
146
 
149
 
147
 	@Override
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
 		// valid
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
 			return new ReturnT<String>(500, "请输入格式正确的“Cron”");
155
 			return new ReturnT<String>(500, "请输入格式正确的“Cron”");
161
 		}
156
 		}
162
-		if (StringUtils.isBlank(jobDesc)) {
157
+		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
163
 			return new ReturnT<String>(500, "请输入“任务描述”");
158
 			return new ReturnT<String>(500, "请输入“任务描述”");
164
 		}
159
 		}
165
-		if (StringUtils.isBlank(author)) {
160
+		if (StringUtils.isBlank(jobInfo.getAuthor())) {
166
 			return new ReturnT<String>(500, "请输入“负责人”");
161
 			return new ReturnT<String>(500, "请输入“负责人”");
167
 		}
162
 		}
168
-		if (StringUtils.isBlank(alarmEmail)) {
163
+		if (StringUtils.isBlank(jobInfo.getAlarmEmail())) {
169
 			return new ReturnT<String>(500, "请输入“报警邮件”");
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
 			return new ReturnT<String>(500, "请输入“JobHandler”");
170
 			return new ReturnT<String>(500, "请输入“JobHandler”");
173
 		}
171
 		}
174
 
172
 
175
 		// childJobKey valid
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
 			for (String childJobKeyItem: childJobKeys) {
176
 			for (String childJobKeyItem: childJobKeys) {
179
 				String[] childJobKeyArr = childJobKeyItem.split("_");
177
 				String[] childJobKeyArr = childJobKeyItem.split("_");
180
 				if (childJobKeyArr.length!=2) {
178
 				if (childJobKeyArr.length!=2) {
188
 		}
186
 		}
189
 
187
 
190
 		// stage job info
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
 		try {
204
 		try {
202
 			// fresh quartz
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
 			if (ret) {
207
 			if (ret) {
205
-				xxlJobInfoDao.update(jobInfo);
208
+				xxlJobInfoDao.update(exists_jobInfo);
206
 				return ReturnT.SUCCESS;
209
 				return ReturnT.SUCCESS;
207
 			} else {
210
 			} else {
208
 				return new ReturnT<String>(500, "更新任务失败");
211
 				return new ReturnT<String>(500, "更新任务失败");
215
 
218
 
216
 	@Override
219
 	@Override
217
 	public ReturnT<String> remove(int jobGroup, String jobName) {
220
 	public ReturnT<String> remove(int jobGroup, String jobName) {
221
+		XxlJobInfo xxlJobInfo = xxlJobInfoDao.load(jobGroup, jobName);
222
+
218
 		try {
223
 		try {
219
 			XxlJobDynamicScheduler.removeJob(jobName, String.valueOf(jobGroup));
224
 			XxlJobDynamicScheduler.removeJob(jobName, String.valueOf(jobGroup));
220
 			xxlJobInfoDao.delete(jobGroup, jobName);
225
 			xxlJobInfoDao.delete(jobGroup, jobName);
221
 			xxlJobLogDao.delete(jobGroup, jobName);
226
 			xxlJobLogDao.delete(jobGroup, jobName);
222
-			xxlJobLogGlueDao.delete(jobGroup, jobName);
227
+			xxlJobLogGlueDao.deleteByJobId(xxlJobInfo.getId());
223
 			return ReturnT.SUCCESS;
228
 			return ReturnT.SUCCESS;
224
 		} catch (SchedulerException e) {
229
 		} catch (SchedulerException e) {
225
 			e.printStackTrace();
230
 			e.printStackTrace();

+ 7 - 1
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Целия файл

113
 			SELECT LAST_INSERT_ID() 
113
 			SELECT LAST_INSERT_ID() 
114
 		</selectKey> 
114
 		</selectKey> 
115
 	</insert>
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
 	<select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
123
 	<select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
118
 		SELECT <include refid="Base_Column_List" />
124
 		SELECT <include refid="Base_Column_List" />
119
 		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
125
 		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t

+ 11 - 22
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml Целия файл

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

+ 1 - 2
xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl Целия файл

94
 <script src="${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.js"></script>
94
 <script src="${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.js"></script>
95
 <script src="${request.contextPath}/static/plugins/codemirror/addon/hint/anyword-hint.js"></script>
95
 <script src="${request.contextPath}/static/plugins/codemirror/addon/hint/anyword-hint.js"></script>
96
 <script>
96
 <script>
97
-var jobGroup = '${jobInfo.jobGroup}';
98
-var jobName = '${jobInfo.jobName}';
97
+var id = '${jobInfo.id}';
99
 </script>
98
 </script>
100
 <script src="${request.contextPath}/static/js/jobcode.index.1.js"></script>
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
                         <label for="lastname" class="col-sm-2 control-label">任务描述<font color="red">*</font></label>
124
                         <label for="lastname" class="col-sm-2 control-label">任务描述<font color="red">*</font></label>
125
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
125
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
126
 					</div>
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
                         <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
140
                         <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
129
                         <div class="col-sm-4">
141
                         <div class="col-sm-4">
130
                             <div class="input-group">
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
                                 <input type="hidden" name="glueSwitch" value="0" >
145
                                 <input type="hidden" name="glueSwitch" value="0" >
134
                             </div>
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
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
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
                     </div>
150
                     </div>
145
 					<div class="form-group">
151
 					<div class="form-group">
146
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
152
 						<label for="lastname" class="col-sm-2 control-label">报警邮件<font color="red">*</font></label>
148
                         <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
154
                         <label for="lastname" class="col-sm-2 control-label">负责人<font color="red">*</font></label>
149
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
155
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="请输入“负责人”" maxlength="50" ></div>
150
 					</div>
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
                     <hr>
161
                     <hr>
152
 					<div class="form-group">
162
 					<div class="form-group">
153
 						<div class="col-sm-offset-3 col-sm-6">
163
 						<div class="col-sm-offset-3 col-sm-6">
191
          	</div>
201
          	</div>
192
          	<div class="modal-body">
202
          	<div class="modal-body">
193
 				<form class="form-horizontal form" role="form" >
203
 				<form class="form-horizontal form" role="form" >
194
-					<div class="form-group">
204
+                    <div class="form-group">
195
                         <label for="firstname" class="col-sm-2 control-label">执行器<font color="red">*</font></label>
205
                         <label for="firstname" class="col-sm-2 control-label">执行器<font color="red">*</font></label>
196
                         <div class="col-sm-4">
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
                         <label for="lastname" class="col-sm-2 control-label">任务描述<font color="red">*</font></label>
213
                         <label for="lastname" class="col-sm-2 control-label">任务描述<font color="red">*</font></label>
200
                         <div class="col-sm-4"><input type="text" class="form-control" name="jobDesc" placeholder="请输入“描述”" maxlength="50" ></div>
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
                     <div class="form-group">
228
                     <div class="form-group">
203
                         <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
229
                         <label for="firstname" class="col-sm-2 control-label">JobHandler<font color="red">*</font></label>
204
                         <div class="col-sm-4">
230
                         <div class="col-sm-4">
212
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
238
                         <div class="col-sm-4"><input type="text" class="form-control" name="executorParam" placeholder="请输入“执行参数”" maxlength="100" ></div>
213
                     </div>
239
                     </div>
214
                     <div class="form-group">
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
                         <label for="lastname" class="col-sm-2 control-label">子任务Key<font color="black">*</font></label>
247
                         <label for="lastname" class="col-sm-2 control-label">子任务Key<font color="black">*</font></label>
218
                         <div class="col-sm-4"><input type="text" class="form-control" name="childJobKey" placeholder="请输入子任务的任务Key,如存在多个逗号分隔" maxlength="100" ></div>
248
                         <div class="col-sm-4"><input type="text" class="form-control" name="childJobKey" placeholder="请输入子任务的任务Key,如存在多个逗号分隔" maxlength="100" ></div>
219
                     </div>
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
 					<hr>
250
 					<hr>
227
 					<div class="form-group">
251
 					<div class="form-group">
228
                         <div class="col-sm-offset-3 col-sm-6">
252
                         <div class="col-sm-offset-3 col-sm-6">
229
 							<button type="submit" class="btn btn-primary"  >保存</button>
253
 							<button type="submit" class="btn btn-primary"  >保存</button>
230
 							<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
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
 						</div>
256
 						</div>
234
 					</div>
257
 					</div>
235
 				</form>
258
 				</form>

+ 1 - 2
xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js Целия файл

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

+ 5 - 7
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js Целия файл

100
 	                			// log url
100
 	                			// log url
101
 	                			var codeBtn = "";
101
 	                			var codeBtn = "";
102
 	                			if(row.glueSwitch > 0){
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
 									codeBtn = '<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(\'' + codeUrl + '\')" >GLUE</button>  '
104
 									codeBtn = '<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(\'' + codeUrl + '\')" >GLUE</button>  '
105
 								}
105
 								}
106
 
106
 
112
 									' jobDesc="'+ row.jobDesc +'" '+
112
 									' jobDesc="'+ row.jobDesc +'" '+
113
 									' author="'+ row.author +'" '+
113
 									' author="'+ row.author +'" '+
114
 									' alarmEmail="'+ row.alarmEmail +'" '+
114
 									' alarmEmail="'+ row.alarmEmail +'" '+
115
+									' executorRouteStrategy="'+row.executorRouteStrategy +'" '+
115
 									' executorHandler="'+row.executorHandler +'" '+
116
 									' executorHandler="'+row.executorHandler +'" '+
116
 									' executorParam="'+ row.executorParam +'" '+
117
 									' executorParam="'+ row.executorParam +'" '+
117
 									' glueSwitch="'+ row.glueSwitch +'" '+
118
 									' glueSwitch="'+ row.glueSwitch +'" '+
323
 	$("#job_list").on('click', '.update',function() {
324
 	$("#job_list").on('click', '.update',function() {
324
 
325
 
325
 		// base data
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
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
329
 		$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
329
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
330
 		$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
330
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
331
 		$("#updateModal .form input[name='author']").val($(this).parent('p').attr("author"));
331
 		$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
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
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
334
 		$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
333
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
335
 		$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
334
         $("#updateModal .form input[name='childJobKey']").val($(this).parent('p').attr("childJobKey"));
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
         // glueSwitch
338
         // glueSwitch
341
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
339
 		var glueSwitch = $(this).parent('p').attr("glueSwitch");
342
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);
340
 		$("#updateModal .form input[name='glueSwitch']").val(glueSwitch);