Skip to content

Commit 88fa019

Browse files
author
胡贵
committed
LTS admin 日志查询, 各种任务列表展示 和 查询 (mysql的实现, mongo后续完成)
1 parent 0a7d13c commit 88fa019

File tree

29 files changed

+760
-193
lines changed

29 files changed

+760
-193
lines changed

lts-admin/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@
5656
<artifactId>lts-queue-mongo</artifactId>
5757
<version>${project.version}</version>
5858
</dependency>
59+
<dependency>
60+
<groupId>com.lts</groupId>
61+
<artifactId>lts-logger-api</artifactId>
62+
<version>${project.version}</version>
63+
</dependency>
64+
<dependency>
65+
<groupId>com.lts</groupId>
66+
<artifactId>lts-logger-mysql</artifactId>
67+
<version>${project.version}</version>
68+
</dependency>
69+
<dependency>
70+
<groupId>com.lts</groupId>
71+
<artifactId>lts-logger-mongo</artifactId>
72+
<version>${project.version}</version>
73+
</dependency>
5974
<dependency>
6075
<groupId>log4j</groupId>
6176
<artifactId>log4j</artifactId>

lts-admin/src/main/java/com/lts/job/web/cluster/AdminApplication.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.lts.job.web.cluster;
22

3+
import com.lts.job.biz.logger.JobLogger;
34
import com.lts.job.core.Application;
45
import com.lts.job.core.cluster.Node;
56
import com.lts.job.queue.*;
@@ -14,6 +15,7 @@ public class AdminApplication extends Application {
1415
private ExecutingJobQueue executingJobQueue;
1516
private JobFeedbackQueue jobFeedbackQueue;
1617
private NodeGroupStore nodeGroupStore;
18+
private JobLogger jobLogger;
1719
private Node node;
1820

1921
public Node getNode() {
@@ -63,4 +65,12 @@ public JobFeedbackQueue getJobFeedbackQueue() {
6365
public void setJobFeedbackQueue(JobFeedbackQueue jobFeedbackQueue) {
6466
this.jobFeedbackQueue = jobFeedbackQueue;
6567
}
68+
69+
public JobLogger getJobLogger() {
70+
return jobLogger;
71+
}
72+
73+
public void setJobLogger(JobLogger jobLogger) {
74+
this.jobLogger = jobLogger;
75+
}
6676
}

lts-admin/src/main/java/com/lts/job/web/controller/api/JobQueueApiController.java

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package com.lts.job.web.controller.api;
22

3+
import com.lts.job.biz.logger.domain.JobLogPo;
4+
import com.lts.job.biz.logger.domain.JobLoggerRequest;
5+
import com.lts.job.core.commons.utils.*;
36
import com.lts.job.core.domain.JobQueueRequest;
47
import com.lts.job.core.domain.PageResponse;
58
import com.lts.job.core.support.CronExpression;
6-
import com.lts.job.core.commons.utils.CollectionUtils;
7-
import com.lts.job.core.commons.utils.StringUtils;
89
import com.lts.job.queue.domain.JobPo;
10+
import com.lts.job.queue.exception.DuplicateJobException;
911
import com.lts.job.web.cluster.AdminApplication;
1012
import com.lts.job.web.controller.AbstractController;
1113
import com.lts.job.web.vo.RestfulResponse;
1214
import org.springframework.beans.factory.annotation.Autowired;
1315
import org.springframework.web.bind.annotation.RequestMapping;
1416
import org.springframework.web.bind.annotation.RestController;
1517

18+
import java.text.ParseException;
19+
import java.util.Date;
20+
1621
/**
1722
* @author Robert HG (254963746@qq.com) on 6/6/15.
1823
*/
@@ -58,7 +63,14 @@ public RestfulResponse cronJobUpdate(JobQueueRequest request) {
5863
// 检查参数
5964
// 1. 检测 cronExpression是否是正确的
6065
if (StringUtils.isNotEmpty(request.getCronExpression())) {
61-
if (!CronExpression.isValidExpression(request.getCronExpression())) {
66+
try {
67+
CronExpression expression = new CronExpression(request.getCronExpression());
68+
if (expression.getTimeAfter(new Date()) == null) {
69+
response.setSuccess(false);
70+
response.setMsg(StringUtils.format("该CronExpression={} 已经没有执行时间点!", request.getCronExpression()));
71+
return response;
72+
}
73+
} catch (ParseException e) {
6274
response.setSuccess(false);
6375
response.setMsg("请输入正确的 CronExpression!");
6476
return response;
@@ -82,4 +94,95 @@ public RestfulResponse cronJobDelete(JobQueueRequest request) {
8294
return response;
8395
}
8496

97+
@RequestMapping("/job-logger/job-logger-get")
98+
public RestfulResponse jobLoggerGet(JobLoggerRequest request) {
99+
RestfulResponse response = new RestfulResponse();
100+
101+
try {
102+
Assert.hasLength(request.getTaskId(), "taskId不能为空!");
103+
Assert.hasLength(request.getTaskTrackerNodeGroup(), "taskTrackerNodeGroup不能为空!");
104+
} catch (IllegalArgumentException e) {
105+
response.setSuccess(false);
106+
response.setMsg(e.getMessage());
107+
return response;
108+
}
109+
110+
PageResponse<JobLogPo> pageResponse = application.getJobLogger().search(request);
111+
response.setResults(pageResponse.getResults());
112+
response.setRows(pageResponse.getRows());
113+
114+
response.setSuccess(true);
115+
return response;
116+
}
117+
118+
@RequestMapping("/job-queue/job-add")
119+
public RestfulResponse jobAdd(JobQueueRequest request) {
120+
RestfulResponse response = new RestfulResponse();
121+
// 表单check
122+
123+
Long triggerTime = null;
124+
try {
125+
Assert.hasLength(request.getTaskId(), "taskId不能为空!");
126+
Assert.hasLength(request.getTaskTrackerNodeGroup(), "taskTrackerNodeGroup不能为空!");
127+
Assert.hasLength(request.getSubmitNodeGroup(), "submitNodeGroup不能为空!");
128+
129+
if (StringUtils.isNotEmpty(request.getCronExpression())) {
130+
try {
131+
CronExpression expression = new CronExpression(request.getCronExpression());
132+
Date nextTime = expression.getTimeAfter(new Date());
133+
if (nextTime == null) {
134+
response.setSuccess(false);
135+
response.setMsg(StringUtils.format("该CronExpression={} 已经没有执行时间点!", request.getCronExpression()));
136+
return response;
137+
} else {
138+
triggerTime = nextTime.getTime();
139+
}
140+
} catch (ParseException e) {
141+
response.setSuccess(false);
142+
response.setMsg("请输入正确的 CronExpression!");
143+
return response;
144+
}
145+
}
146+
147+
} catch (IllegalArgumentException e) {
148+
response.setSuccess(false);
149+
response.setMsg(e.getMessage());
150+
return response;
151+
}
152+
153+
addJob(request, triggerTime);
154+
155+
response.setSuccess(true);
156+
return response;
157+
}
158+
159+
private void addJob(JobQueueRequest request, Long triggerTime) {
160+
JobPo jobPo = new JobPo();
161+
// 这里暂时用UUID来代替
162+
jobPo.setJobId(StringUtils.generateUUID());
163+
jobPo.setCronExpression(request.getCronExpression());
164+
jobPo.setExtParams(request.getExtParams());
165+
jobPo.setGmtCreated(DateUtils.currentTimeMillis());
166+
jobPo.setGmtModified(jobPo.getGmtCreated());
167+
jobPo.setNeedFeedback(request.getNeedFeedback());
168+
jobPo.setPriority(request.getPriority());
169+
jobPo.setTaskId(request.getTaskId());
170+
jobPo.setSubmitNodeGroup(request.getSubmitNodeGroup());
171+
jobPo.setTaskTrackerNodeGroup(request.getTaskTrackerNodeGroup());
172+
if (request.getTriggerTime() != null) {
173+
jobPo.setTriggerTime(request.getTriggerTime().getTime());
174+
}
175+
176+
if (jobPo.isSchedule()) {
177+
application.getCronJobQueue().add(jobPo);
178+
if (triggerTime != null) {
179+
jobPo.setTriggerTime(triggerTime);
180+
}
181+
}
182+
if (jobPo.getTriggerTime() == null) {
183+
jobPo.setTriggerTime(DateUtils.currentTimeMillis());
184+
}
185+
186+
application.getExecutableJobQueue().add(jobPo);
187+
}
85188
}

lts-admin/src/main/java/com/lts/job/web/controller/ui/UIController.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.lts.job.web.controller.ui;
22

33
import com.lts.job.core.cluster.NodeType;
4+
import com.lts.job.core.commons.utils.DateUtils;
45
import com.lts.job.queue.domain.NodeGroupPo;
56
import com.lts.job.web.cluster.AdminApplication;
67
import com.lts.job.web.cluster.RegistryService;
@@ -9,6 +10,7 @@
910
import org.springframework.ui.Model;
1011
import org.springframework.web.bind.annotation.RequestMapping;
1112

13+
import java.util.Date;
1214
import java.util.List;
1315

1416
/**
@@ -29,6 +31,29 @@ public String nodeManagerUI(Model model) {
2931
return "node-manager";
3032
}
3133

34+
@RequestMapping("job-queue/job-add-ui")
35+
public String addJobUI(Model model) {
36+
setAttr(model);
37+
return "job-add";
38+
}
39+
40+
@RequestMapping("job-logger/job-logger")
41+
public String jobLoggerUI(Model model, String taskId, String taskTrackerNodeGroup,
42+
Date startTimestamp, Date endTimestamp) {
43+
model.addAttribute("taskId", taskId);
44+
model.addAttribute("taskTrackerNodeGroup", taskTrackerNodeGroup);
45+
if (startTimestamp == null) {
46+
startTimestamp = DateUtils.addDay(new Date(), -3);
47+
}
48+
model.addAttribute("startTimestamp", DateUtils.formatYMD_HMS(startTimestamp));
49+
if (endTimestamp == null) {
50+
endTimestamp = new Date();
51+
}
52+
model.addAttribute("endTimestamp", DateUtils.formatYMD_HMS(endTimestamp));
53+
setAttr(model);
54+
return "job-logger";
55+
}
56+
3257
@RequestMapping("job-queue/cron-job-queue")
3358
public String cronJobQueueUI(Model model) {
3459
setAttr(model);
@@ -47,10 +72,11 @@ public String executingJobQueueUI(Model model) {
4772
return "executing-job-queue";
4873
}
4974

50-
private void setAttr(Model model){
75+
private void setAttr(Model model) {
5176
List<NodeGroupPo> jobClientNodeGroups = application.getNodeGroupStore().getNodeGroup(NodeType.JOB_CLIENT);
5277
model.addAttribute("jobClientNodeGroups", jobClientNodeGroups);
5378
List<NodeGroupPo> taskTrackerNodeGroups = application.getNodeGroupStore().getNodeGroup(NodeType.TASK_TRACKER);
5479
model.addAttribute("taskTrackerNodeGroups", taskTrackerNodeGroups);
5580
}
81+
5682
}

lts-admin/src/main/java/com/lts/job/web/support/AdminAppFactoryBean.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.lts.job.web.support;
22

3+
import com.lts.job.biz.logger.JobLoggerFactory;
34
import com.lts.job.core.cluster.Config;
45
import com.lts.job.core.cluster.Node;
56
import com.lts.job.core.cluster.NodeType;
@@ -25,6 +26,8 @@ public class AdminAppFactoryBean implements FactoryBean<AdminApplication>, Initi
2526
ExecutingJobQueueFactory.class).getAdaptiveExtension();
2627
NodeGroupStoreFactory nodeGroupStoreFactory = ExtensionLoader.getExtensionLoader(
2728
NodeGroupStoreFactory.class).getAdaptiveExtension();
29+
JobLoggerFactory jobLoggerFactory = ExtensionLoader.getExtensionLoader(
30+
JobLoggerFactory.class).getAdaptiveExtension();
2831

2932
private AdminApplication application;
3033

@@ -70,6 +73,7 @@ public void afterPropertiesSet() throws Exception {
7073
application.setExecutableJobQueue(executableJobQueueFactory.getQueue(config));
7174
application.setExecutingJobQueue(executingJobQueueFactory.getQueue(config));
7275
application.setNodeGroupStore(nodeGroupStoreFactory.getStore(config));
76+
application.setJobLogger(jobLoggerFactory.getJobLogger(config));
7377
}
7478

7579
}

lts-admin/src/main/webapp/main.html

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,31 @@
3030
BUI.use('common/main', function () {
3131
var config = [{
3232
id: 'menu',
33-
homePage: 'index',
34-
menu: [{
35-
text: '概况',
36-
items: [
37-
{id: 'index', text: '概况', href: 'main/index.html', closeable: false}
38-
]
39-
}, {
33+
homePage: 'node',
34+
menu: [
35+
// {
36+
// text: '概况',
37+
// items: [
38+
// {id: 'index', text: '概况', href: 'main/index.html', closeable: false}
39+
// ]
40+
// },
41+
{
4042
text: '节点管理',
4143
items: [
4244
{id: 'node', text: '节点管理', href: 'node/node-manager.htm'}
4345
]
4446
}, {
4547
text: '任务队列管理',
4648
items: [
49+
{id: 'job-add', text: '任务添加', href: 'job-queue/job-add-ui.htm'},
4750
{id: 'cron-job', text: '定时任务管理', href: 'job-queue/cron-job-queue.htm'},
4851
{id: 'executing-job', text: '执行中队列', href: 'job-queue/executing-job-queue.htm'},
4952
{id: 'executable-job', text: '等待执行队列', href: 'job-queue/executable-job-queue.htm'}
5053
]
5154
},{
5255
text: '日志管理',
5356
items: [
54-
{id: 'operation', text: '日志', href: 'main/operation.html'},
57+
{id: 'job-logger', text: '日志', href: 'job-logger/job-logger.htm'},
5558
]
5659
},{
5760
text: '监控报警',

lts-admin/src/main/webapp/main/cron-job-queue.jsp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<form id="searchForm" class="form-horizontal span24">
1212
<div class="row">
1313
<div class="control-group span8">
14-
<label class="control-label">任务ID:</label>
14+
<label class="control-label">TaskId:</label>
1515

1616
<div class="controls">
1717
<input type="text" class="control-text" name="taskId">
@@ -55,9 +55,6 @@
5555
<div class="span3 offset2">
5656
<button type="button" id="btnSearch" class="button button-primary">搜索</button>
5757
</div>
58-
<div class="span3">
59-
<button type="button" id="btnAdd" class="button button-primary">添加</button>
60-
</div>
6158
</div>
6259
</form>
6360
</div>
@@ -138,7 +135,7 @@
138135
function buiInit(BUI, Grid, Form, Data, Overlay, DateUtil) {
139136
140137
var columns = [
141-
{title: '任务ID', dataIndex: 'taskId', width: 230, sortable: false},
138+
{title: '任务ID(TaskId)', dataIndex: 'taskId', width: 230, sortable: false},
142139
{title: '提交节点组', dataIndex: 'submitNodeGroup', width: 150},
143140
{title: '执行节点组', dataIndex: 'taskTrackerNodeGroup', width: 150},
144141
{title: 'cron表达式', dataIndex: 'cronExpression', width: 100},
@@ -167,8 +164,10 @@
167164
}
168165
},
169166
{
170-
title: '操作', dataIndex: '', width: 60, sortable: false, renderer: function (value, obj) {
171-
return '<a href="javascript:;" class="job-edit-btn">编辑<span class="hidden">' + JSON.stringify(obj) + '</span></a>&nbsp;' +
167+
title: '操作', dataIndex: '', width: 90, sortable: false, renderer: function (value, obj) {
168+
var logUrl = "/job-logger/job-logger.htm?taskId=" + obj.taskId + "&taskTrackerNodeGroup=" + obj.taskTrackerNodeGroup;
169+
return '<a target="_blank" href="'+ logUrl +'" class="job-logger-btn" taskId="' + obj.taskId + '" taskTrackerNodeGroup="' + obj.taskTrackerNodeGroup + '">日志</a>&nbsp;' +
170+
'<a href="javascript:;" class="job-edit-btn">编辑<span class="hidden">' + JSON.stringify(obj) + '</span></a>&nbsp;' +
172171
'<a href="javascript:;" class="job-del-btn" jobId="' + obj.jobId + '">删除</a>';
173172
}
174173
}
@@ -192,6 +191,7 @@
192191
bbar: {
193192
pagingBar: true
194193
},
194+
emptyDataTpl : '<div class="centered">查询的数据不存在</div>',
195195
store: store
196196
});
197197
grid.render();
@@ -327,7 +327,7 @@
327327
data: {jobId: jobId},
328328
success: function (json) {
329329
if (json && json.success) {
330-
BUI.Message.Alert("删除成功!");
330+
BUI.Message.Alert("添加成功!");
331331
that.parents(".bui-grid-row").remove();
332332
} else {
333333
BUI.Message.Alert("删除失败, " + json.msg);
@@ -336,6 +336,12 @@
336336
});
337337
}, 'question');
338338
});
339+
340+
$(document).on("click", ".job-logger-btn", function(){
341+
var taskId = $(this).attr("taskId");
342+
var taskTrackerNodeGroup = $(this).attr("taskTrackerNodeGroup");
343+
344+
});
339345
}
340346
341347
</script>

0 commit comments

Comments
 (0)