Ver código fonte

日志重构

xueli.xue 9 anos atrás
pai
commit
ee50140842

+ 2 - 0
README.md Ver arquivo

@@ -4,6 +4,8 @@ github地址:https://github.com/xuxueli/xxl-job
4 4
 git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job
5 5
 
6 6
 博客地址(内附使用教程):http://www.cnblogs.com/xuxueli/p/5021979.html
7
+
8
+技术交流群(仅作技术交流):367260654
7 9
 	
8 10
 # 特点:基于quartz封装实现的的集群任务调度管理平台
9 11
 	1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;

+ 29 - 11
doc/db/tables_xxl_log.sql Ver arquivo

@@ -10,6 +10,7 @@
10 10
 # DROP TABLE IF EXISTS XXL_JOB_QRTZ_JOB_DETAILS;
11 11
 # DROP TABLE IF EXISTS XXL_JOB_QRTZ_CALENDARS;
12 12
 # DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_log`;
13
+# DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_info`;
13 14
 
14 15
 CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS
15 16
   (
@@ -158,18 +159,35 @@ CREATE TABLE XXL_JOB_QRTZ_LOCKS
158 159
 
159 160
 CREATE TABLE `xxl_job_qrtz_trigger_log` (
160 161
   `id` int(11) NOT NULL AUTO_INCREMENT,
161
-  `job_name` varchar(255) NOT NULL,
162
-  `job_cron` varchar(128) DEFAULT NULL,
163
-  `job_class` varchar(255) DEFAULT NULL,
164
-  `job_data` varchar(2048) DEFAULT NULL,
165
-  `trigger_time` datetime DEFAULT NULL,
166
-  `trigger_status` varchar(255) DEFAULT NULL,
167
-  `trigger_msg` varchar(2048) DEFAULT NULL,
168
-  `handle_time` datetime DEFAULT NULL,
169
-  `handle_status` varchar(255) DEFAULT NULL,
170
-  `handle_msg` varchar(2048) DEFAULT NULL,
162
+  `job_group` varchar(255) NOT NULL COMMENT '任务组',
163
+  `job_name` varchar(255) NOT NULL COMMENT '任务名',
164
+  `job_cron` varchar(128) NOT NULL COMMENT '任务执行CORN表达式',
165
+  `job_class` varchar(255) NOT NULL COMMENT '任务执行JobBean',
166
+  `job_data` varchar(2048) DEFAULT NULL COMMENT '任务执行数据',
167
+  `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
168
+  `trigger_status` varchar(255) DEFAULT NULL COMMENT '调度-结果',
169
+  `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志',
170
+  `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
171
+  `handle_status` varchar(255) DEFAULT NULL COMMENT '执行-状态',
172
+  `handle_msg` varchar(2048) DEFAULT NULL COMMENT '执行-日志',
171 173
   PRIMARY KEY (`id`)
172
-) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8;
174
+);
175
+
176
+CREATE TABLE `xxl_job_qrtz_trigger_log` (
177
+  `id` int(11) NOT NULL AUTO_INCREMENT,
178
+  `job_group` varchar(255) NOT NULL COMMENT '任务组',
179
+  `job_name` varchar(255) NOT NULL COMMENT '任务名',
180
+  `job_cron` varchar(128) NOT NULL COMMENT '任务执行CORN表达式',
181
+  `job_class` varchar(255) NOT NULL COMMENT '任务执行JobBean',
182
+  `job_data` varchar(2048) DEFAULT NULL COMMENT '任务执行数据',
183
+  `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
184
+  `trigger_status` varchar(255) DEFAULT NULL COMMENT '调度-结果',
185
+  `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志',
186
+  `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
187
+  `handle_status` varchar(255) DEFAULT NULL COMMENT '执行-状态',
188
+  `handle_msg` varchar(2048) DEFAULT NULL COMMENT '执行-日志',
189
+  PRIMARY KEY (`id`)
190
+);
173 191
 
174 192
 commit;
175 193
 

+ 1 - 1
xxl-job-admin/pom.xml Ver arquivo

@@ -127,7 +127,7 @@
127 127
 		<dependency>
128 128
 			<groupId>org.quartz-scheduler</groupId>
129 129
 			<artifactId>quartz</artifactId>
130
-			<version>2.2.1</version>
130
+			<version>2.2.2</version>
131 131
 		</dependency>
132 132
 		
133 133
 		<!-- httpclient -->

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/controller/IndexController.java Ver arquivo

@@ -13,7 +13,7 @@ public class IndexController {
13 13
 
14 14
 	@RequestMapping("/")
15 15
 	public String index(Model model) {
16
-		return "redirect:job";
16
+		return "redirect:jobinfo";
17 17
 	}
18 18
 	
19 19
 	@RequestMapping("/help")

xxl-job-admin/src/main/java/com/xxl/job/controller/JobController.java → xxl-job-admin/src/main/java/com/xxl/job/controller/JobInfoController.java Ver arquivo

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
22 22
 
23 23
 import com.xxl.job.client.handler.HandlerRepository;
24 24
 import com.xxl.job.client.util.JacksonUtil;
25
+import com.xxl.job.core.constant.Constants.JobGroupEnum;
25 26
 import com.xxl.job.core.model.ReturnT;
26 27
 import com.xxl.job.core.model.XxlJobInfo;
27 28
 import com.xxl.job.core.util.DynamicSchedulerUtil;
@@ -33,17 +34,16 @@ import com.xxl.job.service.job.HttpJobBean;
33 34
  * @author xuxueli 2015-12-19 16:13:16
34 35
  */
35 36
 @Controller
36
-@RequestMapping("/job")
37
-public class JobController {
37
+@RequestMapping("/jobinfo")
38
+public class JobInfoController {
38 39
 	
39 40
 	@Resource
40 41
 	private IXxlJobInfoDao xxlJobInfoDao;
41 42
 	
42 43
 	@RequestMapping
43 44
 	public String index(Model model) {
44
-		//List<Map<String, Object>> jobList = DynamicSchedulerUtil.getJobList();
45
-		//model.addAttribute("jobList", jobList);
46
-		return "job/index";
45
+		model.addAttribute("JobGroupList", JobGroupEnum.values());
46
+		return "jobinfo/index";
47 47
 	}
48 48
 	
49 49
 	@RequestMapping("/pageList")

+ 26 - 37
xxl-job-admin/src/main/java/com/xxl/job/controller/JobLogController.java Ver arquivo

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.controller;
2 2
 
3 3
 import java.text.ParseException;
4
-import java.util.Calendar;
5 4
 import java.util.Date;
6 5
 import java.util.HashMap;
7 6
 import java.util.List;
@@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
17 16
 import org.springframework.web.bind.annotation.RequestParam;
18 17
 import org.springframework.web.bind.annotation.ResponseBody;
19 18
 
19
+import com.xxl.job.core.constant.Constants.JobGroupEnum;
20 20
 import com.xxl.job.core.model.ReturnT;
21 21
 import com.xxl.job.core.model.XxlJobLog;
22 22
 import com.xxl.job.dao.IXxlJobLogDao;
@@ -32,33 +32,9 @@ public class JobLogController {
32 32
 	@Resource
33 33
 	public IXxlJobLogDao xxlJobLogDao;
34 34
 	
35
-	@RequestMapping("/save")
36
-	@ResponseBody
37
-	public ReturnT<String> triggerLog(int triggerLogId, String status, String msg) {
38
-		XxlJobLog log = xxlJobLogDao.load(triggerLogId);
39
-		if (log!=null) {
40
-			log.setHandleTime(new Date());
41
-			log.setHandleStatus(status);
42
-			log.setHandleMsg(msg);
43
-			xxlJobLogDao.updateHandleInfo(log);
44
-			return ReturnT.SUCCESS;
45
-		}
46
-		return ReturnT.FAIL;
47
-	}
48
-	
49 35
 	@RequestMapping
50
-	public String index(Model model, String jobName, String filterTime) {
51
-		
52
-		// 默认filterTime
53
-		Calendar todayz = Calendar.getInstance();
54
-		todayz.set(Calendar.HOUR_OF_DAY, 0);
55
-		todayz.set(Calendar.MINUTE, 0);
56
-		todayz.set(Calendar.SECOND, 0);
57
-		model.addAttribute("triggerTimeStart", todayz.getTime());
58
-		model.addAttribute("triggerTimeEnd", Calendar.getInstance().getTime());
59
-				
60
-		model.addAttribute("jobName", jobName);
61
-		model.addAttribute("filterTime", filterTime);
36
+	public String index(Model model) {
37
+		model.addAttribute("JobGroupList", JobGroupEnum.values());
62 38
 		return "joblog/index";
63 39
 	}
64 40
 	
@@ -66,7 +42,8 @@ public class JobLogController {
66 42
 	@ResponseBody
67 43
 	public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,  
68 44
 			@RequestParam(required = false, defaultValue = "10") int length,
69
-			String jobName, String filterTime) {
45
+			String jobGroup, String jobName, String filterTime) {
46
+		
70 47
 		// parse param
71 48
 		Date triggerTimeStart = null;
72 49
 		Date triggerTimeEnd = null;
@@ -74,24 +51,36 @@ public class JobLogController {
74 51
 			String[] temp = filterTime.split(" - ");
75 52
 			if (temp!=null && temp.length == 2) {
76 53
 				try {
77
-					triggerTimeEnd = DateUtils.parseDate(temp[0], new String[]{"yyyy-MM-dd HH:mm:ss"});
54
+					triggerTimeStart = DateUtils.parseDate(temp[0], new String[]{"yyyy-MM-dd HH:mm:ss"});
78 55
 					triggerTimeEnd = DateUtils.parseDate(temp[1], new String[]{"yyyy-MM-dd HH:mm:ss"});
79
-				} catch (ParseException e) {
80
-					e.printStackTrace();
81
-				}
56
+				} catch (ParseException e) {	}
82 57
 			}
83 58
 		}
84 59
 		
85 60
 		// page query
86
-		List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobName, triggerTimeStart, triggerTimeEnd);
87
-		int list_count = xxlJobLogDao.pageListCount(start, length, jobName, triggerTimeStart, triggerTimeEnd);
61
+		List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobName, triggerTimeStart, triggerTimeEnd);
62
+		int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobName, triggerTimeStart, triggerTimeEnd);
88 63
 		
89 64
 		// package result
90 65
 		Map<String, Object> maps = new HashMap<String, Object>();
91
-	    maps.put("recordsTotal", list_count);	// 总记录数
92
-	    maps.put("recordsFiltered", list_count);// 过滤后的总记录数
93
-	    maps.put("data", list);  				// 分页列表
66
+	    maps.put("recordsTotal", list_count);		// 总记录数
67
+	    maps.put("recordsFiltered", list_count);	// 过滤后的总记录数
68
+	    maps.put("data", list);  					// 分页列表
94 69
 		return maps;
95 70
 	}
96 71
 	
72
+	@RequestMapping("/save")
73
+	@ResponseBody
74
+	public ReturnT<String> triggerLog(int triggerLogId, String status, String msg) {
75
+		XxlJobLog log = xxlJobLogDao.load(triggerLogId);
76
+		if (log!=null) {
77
+			log.setHandleTime(new Date());
78
+			log.setHandleStatus(status);
79
+			log.setHandleMsg(msg);
80
+			xxlJobLogDao.updateHandleInfo(log);
81
+			return ReturnT.SUCCESS;
82
+		}
83
+		return ReturnT.FAIL;
84
+	}
85
+	
97 86
 }

+ 72 - 16
xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobInfo.java Ver arquivo

@@ -9,69 +9,125 @@ import java.util.Date;
9 9
 public class XxlJobInfo {
10 10
 	
11 11
 	private int id;
12
-	// job info
13
-	private String jobName;
14
-	private String jobCron;		// base on quartz
15
-	private String jobClass;	// base on quartz
16
-	private String jobStatus;	// base on quartz
17
-	private String jobData;		// base on db, Map-JSON-String
12
+	
13
+	private String jobGroup;	// base on quartz	任务组
14
+	private String jobName;		// base on quartz	任务名
15
+	private String jobCron;		// base on quartz	任务执行CRON表达式
16
+	private String jobClass;	// base on quartz	任务执行JobBean
17
+	private String jobData;		// base on db, Map-JSON-String	任务执行数据
18
+	
18 19
 	private Date addTime;
19 20
 	private Date updateTime;
20 21
 	
22
+	private String author;		// 作者
23
+	private String alarmEmail;	// 报警邮件
24
+	private int alarmThreshold;	// 报警阀值
25
+	
26
+	// copy from quartz
27
+	private String jobStatus;	// 任务状态
28
+
21 29
 	public int getId() {
22 30
 		return id;
23 31
 	}
32
+
24 33
 	public void setId(int id) {
25 34
 		this.id = id;
26 35
 	}
36
+
37
+	public String getJobGroup() {
38
+		return jobGroup;
39
+	}
40
+
41
+	public void setJobGroup(String jobGroup) {
42
+		this.jobGroup = jobGroup;
43
+	}
44
+
27 45
 	public String getJobName() {
28 46
 		return jobName;
29 47
 	}
48
+
30 49
 	public void setJobName(String jobName) {
31 50
 		this.jobName = jobName;
32 51
 	}
52
+
33 53
 	public String getJobCron() {
34 54
 		return jobCron;
35 55
 	}
56
+
36 57
 	public void setJobCron(String jobCron) {
37 58
 		this.jobCron = jobCron;
38 59
 	}
60
+
39 61
 	public String getJobClass() {
40 62
 		return jobClass;
41 63
 	}
64
+
42 65
 	public void setJobClass(String jobClass) {
43 66
 		this.jobClass = jobClass;
44 67
 	}
45
-	public String getJobStatus() {
46
-		return jobStatus;
47
-	}
48
-	public void setJobStatus(String jobStatus) {
49
-		this.jobStatus = jobStatus;
50
-	}
68
+
51 69
 	public String getJobData() {
52 70
 		return jobData;
53 71
 	}
72
+
54 73
 	public void setJobData(String jobData) {
55 74
 		this.jobData = jobData;
56 75
 	}
76
+
57 77
 	public Date getAddTime() {
58 78
 		return addTime;
59 79
 	}
80
+
60 81
 	public void setAddTime(Date addTime) {
61 82
 		this.addTime = addTime;
62 83
 	}
84
+
63 85
 	public Date getUpdateTime() {
64 86
 		return updateTime;
65 87
 	}
88
+
66 89
 	public void setUpdateTime(Date updateTime) {
67 90
 		this.updateTime = updateTime;
68 91
 	}
69
-	
92
+
93
+	public String getAuthor() {
94
+		return author;
95
+	}
96
+
97
+	public void setAuthor(String author) {
98
+		this.author = author;
99
+	}
100
+
101
+	public String getAlarmEmail() {
102
+		return alarmEmail;
103
+	}
104
+
105
+	public void setAlarmEmail(String alarmEmail) {
106
+		this.alarmEmail = alarmEmail;
107
+	}
108
+
109
+	public int getAlarmThreshold() {
110
+		return alarmThreshold;
111
+	}
112
+
113
+	public void setAlarmThreshold(int alarmThreshold) {
114
+		this.alarmThreshold = alarmThreshold;
115
+	}
116
+
117
+	public String getJobStatus() {
118
+		return jobStatus;
119
+	}
120
+
121
+	public void setJobStatus(String jobStatus) {
122
+		this.jobStatus = jobStatus;
123
+	}
124
+
70 125
 	@Override
71 126
 	public String toString() {
72
-		return "XxlJobInfo [id=" + id + ", jobName=" + jobName + ", jobCron=" + jobCron + ", jobClass=" + jobClass
73
-				+ ", jobStatus=" + jobStatus + ", jobData=" + jobData + ", addTime=" + addTime + ", updateTime="
74
-				+ updateTime + "]";
127
+		return "XxlJobInfo [id=" + id + ", jobGroup=" + jobGroup + ", jobName=" + jobName + ", jobCron=" + jobCron
128
+				+ ", jobClass=" + jobClass + ", jobData=" + jobData + ", addTime=" + addTime + ", updateTime="
129
+				+ updateTime + ", author=" + author + ", alarmEmail=" + alarmEmail + ", alarmThreshold="
130
+				+ alarmThreshold + ", jobStatus=" + jobStatus + "]";
75 131
 	}
76 132
 	
77 133
 }

+ 12 - 4
xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobLog.java Ver arquivo

@@ -9,7 +9,9 @@ import java.util.Date;
9 9
 public class XxlJobLog {
10 10
 	
11 11
 	private int id;
12
+	
12 13
 	// job info
14
+	private String jobGroup;
13 15
 	private String jobName;
14 16
 	private String jobCron;
15 17
 	private String jobClass;
@@ -31,6 +33,12 @@ public class XxlJobLog {
31 33
 	public void setId(int id) {
32 34
 		this.id = id;
33 35
 	}
36
+	public String getJobGroup() {
37
+		return jobGroup;
38
+	}
39
+	public void setJobGroup(String jobGroup) {
40
+		this.jobGroup = jobGroup;
41
+	}
34 42
 	public String getJobName() {
35 43
 		return jobName;
36 44
 	}
@@ -94,10 +102,10 @@ public class XxlJobLog {
94 102
 	
95 103
 	@Override
96 104
 	public String toString() {
97
-		return "XxlJobLog [id=" + id + ", jobName=" + jobName + ", jobCron=" + jobCron + ", jobClass=" + jobClass
98
-				+ ", jobData=" + jobData + ", triggerTime=" + triggerTime + ", triggerStatus=" + triggerStatus
99
-				+ ", triggerMsg=" + triggerMsg + ", handleTime=" + handleTime + ", handleStatus=" + handleStatus
100
-				+ ", handleMsg=" + handleMsg + "]";
105
+		return "XxlJobLog [id=" + id + ", jobGroup=" + jobGroup + ", jobName=" + jobName + ", jobCron=" + jobCron
106
+				+ ", jobClass=" + jobClass + ", jobData=" + jobData + ", triggerTime=" + triggerTime
107
+				+ ", triggerStatus=" + triggerStatus + ", triggerMsg=" + triggerMsg + ", handleTime=" + handleTime
108
+				+ ", handleStatus=" + handleStatus + ", handleMsg=" + handleMsg + "]";
101 109
 	}
102 110
 	
103 111
 }

+ 4 - 7
xxl-job-admin/src/main/java/com/xxl/job/dao/IXxlJobLogDao.java Ver arquivo

@@ -1,6 +1,5 @@
1 1
 package com.xxl.job.dao;
2 2
 
3
-
4 3
 import java.util.Date;
5 4
 import java.util.List;
6 5
 
@@ -12,16 +11,14 @@ import com.xxl.job.core.model.XxlJobLog;
12 11
  */
13 12
 public interface IXxlJobLogDao {
14 13
 	
15
-	public int save(XxlJobLog xxlJobLog);
14
+	public List<XxlJobLog> pageList(int offset, int pagesize, String jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd);
15
+	public int pageListCount(int offset, int pagesize, String jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd);
16 16
 	
17 17
 	public XxlJobLog load(int id);
18
+	public XxlJobLog loadByGroupAndName(String jobGroup, String jobName);
18 19
 	
20
+	public int save(XxlJobLog xxlJobLog);
19 21
 	public int updateTriggerInfo(XxlJobLog xxlJobLog);
20
-	
21 22
 	public int updateHandleInfo(XxlJobLog xxlJobLog);
22 23
 	
23
-	public List<XxlJobLog> pageList(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd);
24
-	
25
-	public int pageListCount(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd);
26
-	
27 24
 }

+ 39 - 27
xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobLogDaoImpl.java Ver arquivo

@@ -23,19 +23,53 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
23 23
 	public SqlSessionTemplate sqlSessionTemplate;
24 24
 
25 25
 	@Override
26
-	public int save(XxlJobLog xxlJobLog) {
27
-		if (xxlJobLog!=null && xxlJobLog.getJobData().length()>2000) {
28
-			xxlJobLog.setJobData(xxlJobLog.getJobData().substring(0, 2000));
29
-		}
30
-		return sqlSessionTemplate.insert("XxlJobLogMapper.save", xxlJobLog);
26
+	public List<XxlJobLog> pageList(int offset, int pagesize, String jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
27
+		HashMap<String, Object> params = new HashMap<String, Object>();
28
+		params.put("offset", offset);
29
+		params.put("pagesize", pagesize);
30
+		params.put("jobGroup", jobGroup);
31
+		params.put("jobName", jobName);
32
+		params.put("triggerTimeStart", triggerTimeStart);
33
+		params.put("triggerTimeEnd", triggerTimeEnd);
34
+		
35
+		return sqlSessionTemplate.selectList("XxlJobLogMapper.pageList", params);
36
+	}
37
+
38
+	@Override
39
+	public int pageListCount(int offset, int pagesize, String jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
40
+		HashMap<String, Object> params = new HashMap<String, Object>();
41
+		params.put("offset", offset);
42
+		params.put("pagesize", pagesize);
43
+		params.put("jobGroup", jobGroup);
44
+		params.put("jobName", jobName);
45
+		params.put("triggerTimeStart", triggerTimeStart);
46
+		params.put("triggerTimeEnd", triggerTimeEnd);
47
+		
48
+		return sqlSessionTemplate.selectOne("XxlJobLogMapper.pageListCount", params);
31 49
 	}
32 50
 
33 51
 	@Override
34 52
 	public XxlJobLog load(int id) {
35 53
 		return sqlSessionTemplate.selectOne("XxlJobLogMapper.load", id);
36 54
 	}
55
+	
56
+	@Override
57
+	public XxlJobLog loadByGroupAndName(String jobGroup, String jobName) {
58
+		HashMap<String, Object> params = new HashMap<String, Object>();
59
+		params.put("jobGroup", jobGroup);
60
+		params.put("jobName", jobName);
61
+		return sqlSessionTemplate.selectOne("XxlJobLogMapper.loadByGroupAndName", params);
62
+	}
37 63
 
38 64
 	@Override
65
+	public int save(XxlJobLog xxlJobLog) {
66
+		if (xxlJobLog!=null && xxlJobLog.getJobData().length()>2000) {
67
+			xxlJobLog.setJobData(xxlJobLog.getJobData().substring(0, 2000));
68
+		}
69
+		return sqlSessionTemplate.insert("XxlJobLogMapper.save", xxlJobLog);
70
+	}
71
+	
72
+	@Override
39 73
 	public int updateTriggerInfo(XxlJobLog xxlJobLog) {
40 74
 		if (xxlJobLog!=null && xxlJobLog.getTriggerMsg().length()>2000) {
41 75
 			xxlJobLog.setTriggerMsg(xxlJobLog.getTriggerMsg().substring(0, 2000));
@@ -50,27 +84,5 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
50 84
 		}
51 85
 		return sqlSessionTemplate.update("XxlJobLogMapper.updateHandleInfo", xxlJobLog);
52 86
 	}
53
-
54
-	@Override
55
-	public List<XxlJobLog> pageList(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
56
-		HashMap<String, Object> params = new HashMap<String, Object>();
57
-		params.put("offset", offset);
58
-		params.put("pagesize", pagesize);
59
-		params.put("jobName", jobName);
60
-		params.put("triggerTimeStart", triggerTimeStart);
61
-		params.put("triggerTimeEnd", triggerTimeEnd);
62
-		return sqlSessionTemplate.selectList("XxlJobLogMapper.pageList", params);
63
-	}
64
-
65
-	@Override
66
-	public int pageListCount(int offset, int pagesize,String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
67
-		HashMap<String, Object> params = new HashMap<String, Object>();
68
-		params.put("offset", offset);
69
-		params.put("pagesize", pagesize);
70
-		params.put("jobName", jobName);
71
-		params.put("triggerTimeStart", triggerTimeStart);
72
-		params.put("triggerTimeEnd", triggerTimeEnd);
73
-		return sqlSessionTemplate.selectOne("XxlJobLogMapper.pageListCount", params);
74
-	}
75 87
 	
76 88
 }

+ 61 - 44
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml Ver arquivo

@@ -6,6 +6,7 @@
6 6
 	<resultMap id="XxlJobLog" type="com.xxl.job.core.model.XxlJobLog" >
7 7
 		<result column="id" property="id" />
8 8
 	
9
+	    <result column="job_group" property="jobGroup" />
9 10
 	    <result column="job_name" property="jobName" />
10 11
 	    <result column="job_cron" property="jobCron" />
11 12
 	    <result column="job_class" property="jobClass" />
@@ -22,6 +23,7 @@
22 23
 
23 24
 	<sql id="Base_Column_List">
24 25
 		t.id,
26
+		t.job_group,
25 27
 		t.job_name,
26 28
 		t.job_cron,
27 29
 		t.job_class,
@@ -34,16 +36,71 @@
34 36
 		t.handle_msg
35 37
 	</sql>
36 38
 	
39
+	<select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobLog">
40
+		SELECT <include refid="Base_Column_List" />
41
+		FROM xxl_job_qrtz_trigger_log AS t
42
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
43
+			<if test="jobGroup != null and jobGroup != ''">
44
+				AND t.job_group = #{jobGroup}
45
+			</if>
46
+			<if test="jobName != null and jobName != ''">
47
+				AND t.job_name = #{jobName}
48
+			</if>
49
+			<if test="triggerTimeStart != null">
50
+				AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
51
+			</if>
52
+			<if test="triggerTimeEnd != null">
53
+				AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
54
+			</if>
55
+		</trim>
56
+		ORDER BY id DESC
57
+		LIMIT #{offset}, #{pagesize}
58
+	</select>
59
+	
60
+	<select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
61
+		SELECT count(1)
62
+		FROM xxl_job_qrtz_trigger_log AS t
63
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
64
+			<if test="jobGroup != null and jobGroup != ''">
65
+				AND t.job_group = #{jobGroup}
66
+			</if>
67
+			<if test="jobName != null and jobName != ''">
68
+				AND t.job_name = #{jobName}
69
+			</if>
70
+			<if test="triggerTimeStart != null">
71
+				AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
72
+			</if>
73
+			<if test="triggerTimeEnd != null">
74
+				AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
75
+			</if>
76
+		</trim>
77
+	</select>
78
+	
79
+	<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog">
80
+		SELECT <include refid="Base_Column_List" />
81
+		FROM xxl_job_qrtz_trigger_log AS t
82
+		WHERE t.id = #{id}
83
+	</select>
84
+	
85
+	<select id="loadByGroupAndName" parameterType="java.util.HashMap" resultMap="XxlJobLog">
86
+		SELECT <include refid="Base_Column_List" />
87
+		FROM xxl_job_qrtz_trigger_log AS t
88
+		WHERE t.job_group = #{jobGroup}
89
+			AND t.job_name = #{jobName}
90
+	</select>
91
+	
37 92
 	<insert id="save" parameterType="com.xxl.job.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
38 93
 		INSERT INTO `xxl_job_qrtz_trigger_log` (
39
-			`job_name`, 
94
+			`job_group`,
95
+			`job_name`,
40 96
 			`job_cron`, 
41 97
 			`job_class`, 
42 98
 			`job_data`
43 99
 		) VALUES (
44
-			#{jobName}, 
45
-			#{jobCron}, 
46
-			#{jobClass}, 
100
+			#{jobGroup}, 
101
+			#{jobName},
102
+			#{jobCron},
103
+			#{jobClass},
47 104
 			#{jobData}
48 105
 		);
49 106
 		<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id"> 
@@ -51,12 +108,6 @@
51 108
 		</selectKey> 
52 109
 	</insert>
53 110
 	
54
-	<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog">
55
-		SELECT <include refid="Base_Column_List" />
56
-		FROM xxl_job_qrtz_trigger_log AS t
57
-		WHERE t.id = #{id}
58
-	</select>
59
-	
60 111
 	<update id="updateTriggerInfo">
61 112
 		UPDATE `xxl_job_qrtz_trigger_log` 
62 113
 		SET 
@@ -75,38 +126,4 @@
75 126
 		WHERE `id`= #{id}
76 127
 	</update>
77 128
 	
78
-	<select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobLog">
79
-		SELECT <include refid="Base_Column_List" />
80
-		FROM xxl_job_qrtz_trigger_log AS t
81
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
82
-			<if test="jobName != null and jobName!=''">
83
-				AND t.job_name = #{jobName}
84
-			</if>
85
-			<if test="triggerTimeStart != null">
86
-				AND t.trigger_time <![CDATA[ > ]]> #{triggerTimeStart}
87
-			</if>
88
-			<if test="triggerTimeEnd != null">
89
-				AND t.trigger_time <![CDATA[ < ]]> #{triggerTimeEnd}
90
-			</if>
91
-		</trim>
92
-		ORDER BY id DESC
93
-		LIMIT #{offset}, #{pagesize}
94
-	</select>
95
-	
96
-	<select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
97
-		SELECT count(1)
98
-		FROM xxl_job_qrtz_trigger_log AS t
99
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
100
-			<if test="jobName != null and jobName!=''">
101
-				AND t.job_name = #{jobName}
102
-			</if>
103
-			<if test="triggerTimeStart != null">
104
-				AND t.trigger_time <![CDATA[ > ]]> #{triggerTimeStart}
105
-			</if>
106
-			<if test="triggerTimeEnd != null">
107
-				AND t.trigger_time <![CDATA[ < ]]> #{triggerTimeEnd}
108
-			</if>
109
-		</trim>
110
-	</select>
111
-	
112 129
 </mapper>

+ 2 - 0
xxl-job-admin/src/main/resources/springmvc-context.xml Ver arquivo

@@ -38,6 +38,8 @@
38 38
 		<property name="order" value="0" />
39 39
 	</bean>
40 40
 	
41
+	<bean id="exceptionResolver" class="com.xxl.job.core.resolver.WebExceptionResolver" />
42
+	
41 43
 	<!--
42 44
 	// 自定义拦截器,支持SSO登陆拦截 
43 45
 	<mvc:interceptors>

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl Ver arquivo

@@ -64,7 +64,7 @@
64 64
 			<!-- sidebar menu: : style can be found in sidebar.less -->
65 65
 			<ul class="sidebar-menu">
66 66
 				<li class="header">常用模块</li>
67
-				<li class="nav-click" ><a href="${request.contextPath}/job/"><i class="fa fa-circle-o text-red"></i> <span>调度管理</span></a></li>
67
+				<li class="nav-click" ><a href="${request.contextPath}/jobinfo"><i class="fa fa-circle-o text-red"></i> <span>调度管理</span></a></li>
68 68
 				<li class="nav-click" ><a href="${request.contextPath}/joblog"><i class="fa fa-circle-o text-yellow"></i><span>调度日志</span></a></li>
69 69
 				<li class="nav-click" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-yellow"></i><span>使用教程</span></a></li>
70 70
 			</ul>

xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl → xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl Ver arquivo

@@ -30,6 +30,16 @@
30 30
 	    <section class="content">
31 31
 	    
32 32
 	    	<div class="row">
33
+	    		<div class="col-xs-4">
34
+	              	<div class="input-group">
35
+	                	<span class="input-group-addon">任务组</span>
36
+                		<select class="form-control" id="jobGroup" >
37
+                			<#list JobGroupList as group>
38
+                				<option value="${group}" >${group.desc}</option>
39
+                			</#list>
40
+	                  	</select>
41
+	              	</div>
42
+	            </div>
33 43
 	            <div class="col-xs-4">
34 44
 	              	<div class="input-group">
35 45
 	                	<span class="input-group-addon">
@@ -128,16 +138,24 @@
128 138
 
129 139
 <!-- job新增.模态框 -->
130 140
 <div class="modal fade" id="addModal" tabindex="-1" role="dialog"  aria-hidden="true">
131
-	<div class="modal-dialog">
141
+	<div class="modal-dialog modal-lg">
132 142
 		<div class="modal-content">
133 143
 			<div class="modal-header">
134
-            	<h4 class="modal-title" >新增调度信息</h4>
144
+            	<h4 class="modal-title" >新增任务调度信息</h4>
135 145
          	</div>
136 146
          	<div class="modal-body">
137 147
 				<form class="form-horizontal form" role="form" >
138 148
 					<div class="form-group">
139
-						<label for="firstname" class="col-sm-3 control-label">任务Key</label>
140
-						<div class="col-sm-9"><input type="text" class="form-control" name="triggerKeyName" placeholder="请输入任务Key" minlength="4" maxlength="100" ></div>
149
+						<label for="firstname" class="col-sm-2 control-label">任务组</label>
150
+						<div class="col-sm-4">
151
+							<select class="form-control" name="jobGroup" >
152
+		            			<#list JobGroupList as group>
153
+		            				<option value="${group}" >${group.desc}</option>
154
+		            			</#list>
155
+		                  	</select>
156
+						</div>
157
+						<label for="firstname" class="col-sm-2 control-label">任务名</label>
158
+						<div class="col-sm-4"><input type="text" class="form-control" name="triggerKeyName" placeholder="请输入任务Key" minlength="4" maxlength="100" ></div>
141 159
 					</div>
142 160
 					<div class="form-group">
143 161
 						<label for="lastname" class="col-sm-3 control-label">任务Corn</label>
@@ -219,6 +237,6 @@
219 237
 <script src="${request.contextPath}/static/adminlte/plugins/daterangepicker/moment.min.js"></script>
220 238
 <script src="${request.contextPath}/static/adminlte/plugins/daterangepicker/daterangepicker.js"></script>
221 239
 <script>var base_url = '${request.contextPath}';</script>
222
-<script src="${request.contextPath}/static/js/job.index.1.js"></script>
240
+<script src="${request.contextPath}/static/js/jobinfo.index.1.js"></script>
223 241
 </body>
224 242
 </html>

+ 32 - 21
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/index.ftl Ver arquivo

@@ -30,23 +30,33 @@
30 30
 		<!-- Main content -->
31 31
 	    <section class="content">
32 32
 	    	<div class="row">
33
-	            <div class="col-xs-5">
33
+	    		<div class="col-xs-3">
34
+ 					<div class="input-group">
35
+	                	<span class="input-group-addon">任务组</span>
36
+                		<select class="form-control" id="jobGroup" >
37
+                			<#list JobGroupList as group>
38
+                				<option value="${group}" <#if jobInfo?exists && group == jobInfo.jobGroup>selected</#if> >${group.desc}</option>
39
+                			</#list>
40
+	                  	</select>
41
+	              	</div>
42
+	            </div>
43
+	            <div class="col-xs-3">
44
+	              	<div class="input-group">
45
+	                	<span class="input-group-addon">任务名</span>
46
+	                	<input type="text" class="form-control" id="jobName" value="${jobName}" autocomplete="on" >
47
+	              	</div>
48
+	            </div>
49
+	            <div class="col-xs-4">
34 50
               		<div class="input-group">
35 51
                 		<span class="input-group-addon">
36 52
 	                  		调度时间
37 53
 	                	</span>
38 54
 	                	<input type="text" class="form-control" id="filterTime" readonly 
39
-	                		value="<#if triggerTimeStart?exists && triggerTimeEnd?exists >${triggerTimeStart?if_exists?string('yyyy-MM-dd HH:mm:ss')} - ${triggerTimeEnd?if_exists?string('yyyy-MM-dd HH:mm:ss')}</#if>"  >
40
-	              	</div>
41
-	            </div>
42
-	            <div class="col-xs-5">
43
-	              	<div class="input-group">
44
-	                	<span class="input-group-addon">
45
-	                  		jobName
46
-	                	</span>
47
-	                	<input type="text" class="form-control" id="jobName" value="${jobName}" autocomplete="on" >
55
+	                		value2="<#if triggerTimeStart?exists && triggerTimeEnd?exists >${triggerTimeStart?if_exists?string('yyyy-MM-dd HH:mm:ss')} - ${triggerTimeEnd?if_exists?string('yyyy-MM-dd HH:mm:ss')}</#if>"  >
48 56
 	              	</div>
49 57
 	            </div>
58
+	            
59
+				
50 60
 	            <div class="col-xs-2">
51 61
 	            	<button class="btn btn-block btn-info" id="searchBtn">搜索</button>
52 62
 	            </div>
@@ -60,17 +70,18 @@
60 70
 			              	<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
61 71
 				                <thead>
62 72
 					            	<tr>
63
-					                	<th>id</th>
64
-					                  	<th>jobName</th>
65
-					                  	<th>jobCron</th>
66
-					                  	<th>jobClass</th>
67
-					                  	<th>jobData</th>
68
-					                  	<th>triggerTime</th>
69
-					                  	<th>triggerStatus</th>
70
-					                  	<th>triggerMsg</th>
71
-					                  	<th>handleTime</th>
72
-					                  	<th>handleStatus</th>
73
-					                  	<th>handleMsg</th>
73
+					                	<th name="id" >id</th>
74
+					                	<th name="jobGroup" >任务组</th>
75
+					                  	<th name="jobName" >任务名</th>
76
+					                  	<th name="jobCron" >Cron</th>
77
+					                  	<th name="jobClass" >JobBean</th>
78
+					                  	<th name="jobData" >任务数据</th>
79
+					                  	<th name="triggerTime" >调度时间</th>
80
+					                  	<th name="triggerStatus" >调度结果</th>
81
+					                  	<th name="triggerMsg" >调度日志</th>
82
+					                  	<th name="handleTime" >执行时间</th>
83
+					                  	<th name="handleStatus" >执行结果</th>
84
+					                  	<th name="handleMsg" >执行日志</th>
74 85
 					                </tr>
75 86
 				                </thead>
76 87
 				                <tbody></tbody>

xxl-job-admin/src/main/webapp/static/js/job.index.1.js → xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js Ver arquivo

@@ -5,7 +5,7 @@ $(function() {
5 5
 		"processing" : true, 
6 6
 	    "serverSide": true,
7 7
 		"ajax": {
8
-			url: base_url + "/job/pageList",
8
+			url: base_url + "/jobinfo/pageList",
9 9
 	        data : function ( d ) {
10 10
                 d.jobName = $('#jobName').val()
11 11
             }

+ 37 - 16
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js Ver arquivo

@@ -8,46 +8,66 @@ $(function() {
8 8
 		"ajax": {
9 9
 	        url: base_url + "/joblog/pageList" ,
10 10
 	        data : function ( d ) {
11
+                d.jobGroup = $('#jobGroup').val();
12
+                d.jobName = $('#jobName').val();
11 13
                 d.filterTime = $('#filterTime').val();
12
-                d.jobName = $('#jobName').val()
13 14
             }
14 15
 	    },
15
-	    //"scrollX": true,	// X轴滚动条,取消自适应
16
+	    "searching": false,
17
+	    "ordering": false,
18
+	    //"scrollX": false,
16 19
 	    "columns": [
17 20
 	                { "data": 'id', "bSortable": false, "visible" : false},
18
-	                { "data": 'jobName', "bSortable": false},
19
-	                { "data": 'jobCron', "bSortable": false, "visible" : false},
20
-	                { "data": 'jobClass', "bSortable": false, "visible" : false},
21
-	                { "data": 'jobData', "bSortable": false, "visible" : false},
22 21
 	                { 
23
-	                	"data": 'triggerTime', 
22
+	                	"data": 'jobGroup', 
24 23
 	                	"bSortable": false, 
25 24
 	                	"render": function ( data, type, row ) {
25
+	            			var groupMenu = $("#jobGroup").find("option");
26
+	            			for ( var index in $("#jobGroup").find("option")) {
27
+	            				if ($(groupMenu[index]).attr('value') == data) {
28
+									return $(groupMenu[index]).html();
29
+								}
30
+							}
31
+	            			return data;
32
+	            		}
33
+            		},
34
+	                { "data": 'jobName'},
35
+	                { "data": 'jobCron', "visible" : false},
36
+	                { "data": 'jobClass', "visible" : false},
37
+	                { 
38
+	                	"data": 'jobData',
39
+	                	"visible" : false,
40
+	                	"render": function ( data, type, row ) {
41
+	                		return data?'<a class="logTips" href="javascript:;" >查看<span style="display:none;">'+ data +'</span></a>':"无";
42
+	                	}
43
+	                },
44
+	                { 
45
+	                	"data": 'triggerTime', 
46
+	                	"render": function ( data, type, row ) {
26 47
 	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
27 48
 	                	}
28 49
 	                },
29
-	                { "data": 'triggerStatus', "bSortable": false},
30
-	                { "data": 'triggerMsg',"bSortable": false,
50
+	                { "data": 'triggerStatus'},
51
+	                { 
52
+	                	"data": 'triggerMsg',
31 53
 	                	"render": function ( data, type, row ) {
32
-	                		return data?'<a class="logTips" href="javascript:;" >调度日志<span style="display:none;">'+ data +'</span></a>':"无";
54
+	                		return data?'<a class="logTips" href="javascript:;" >查看<span style="display:none;">'+ data +'</span></a>':"无";
33 55
 	                	}
34 56
 	                },
35 57
 	                { 
36 58
 	                	"data": 'handleTime',
37
-	                	"bSortable": false,
38 59
 	                	"render": function ( data, type, row ) {
39 60
 	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
40 61
 	                	}
41 62
 	                },
42 63
 	                { "data": 'handleStatus',"bSortable": false},
43
-	                { "data": 'handleMsg' , "bSortable": false,
64
+	                { 
65
+	                	"data": 'handleMsg',
44 66
 	                	"render": function ( data, type, row ) {
45
-	                		return data?'<a class="logTips" href="javascript:;" >执行日志<span style="display:none;">'+ data +'</span></a>':"无";
67
+	                		return data?'<a class="logTips" href="javascript:;" >查看<span style="display:none;">'+ data +'</span></a>':"无";
46 68
 	                	}
47 69
 	                }
48 70
 	            ],
49
-	    "searching": false,
50
-	    "ordering": true,
51 71
 		"language" : {
52 72
 			"sProcessing" : "处理中...",
53 73
 			"sLengthMenu" : "每页 _MENU_ 条记录",
@@ -94,7 +114,7 @@ $(function() {
94 114
             '最近7日': [moment().subtract('days', 6), moment()],
95 115
             '最近30日': [moment().subtract('days', 29), moment()]
96 116
         },
97
-        opens : 'right', //日期选择框的弹出位置
117
+        opens : 'left', //日期选择框的弹出位置
98 118
         locale : {
99 119
         	customRangeLabel : '自定义',
100 120
             applyLabel : '确定',
@@ -106,6 +126,7 @@ $(function() {
106 126
             firstDay : 1
107 127
         }
108 128
 	});
129
+	$('#filterTime').val( moment(new Date()).format("YYYY-MM-DD 00:00:00") + ' - ' + moment(new Date()).format("YYYY-MM-DD HH:mm:ss") );
109 130
 	
110 131
 	// 搜索按钮
111 132
 	$('#searchBtn').on('click', function(){