package com.hqyg.disjob.console.web.controller;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.github.abel533.echarts.axis.CategoryAxis;
import com.github.abel533.echarts.axis.TimeAxis;
import com.github.abel533.echarts.code.AxisType;
import com.github.abel533.echarts.code.Magic;
import com.github.abel533.echarts.code.Trigger;
import com.github.abel533.echarts.data.Data;
import com.github.abel533.echarts.feature.MagicType;
import com.github.abel533.echarts.json.GsonOption;
import com.github.abel533.echarts.series.Line;
import com.github.abel533.echarts.series.MarkPoint;
import com.github.abel533.echarts.style.ItemStyle;
import com.github.abel533.echarts.style.itemstyle.Normal;
import com.hqyg.disjob.common.model.Result;
import com.hqyg.disjob.common.util.StringHandleUtil;
import com.hqyg.disjob.console.SystemDefault;
import com.hqyg.disjob.console.service.JobInfoService;
import com.hqyg.disjob.console.util.AppHelper;
import com.hqyg.disjob.monitor.db.service.DBJobBasicInfoService;
import com.hqyg.disjob.monitor.db.service.DBJobExeProgressService;
import com.hqyg.disjob.monitor.db.service.DBStatisticsService;
import com.hqyg.disjob.monitor.db.domain.DBJobBasicInfo;
import com.hqyg.disjob.monitor.db.domain.DBJobExeProgress;
import com.hqyg.disjob.monitor.db.domain.DBStatistics;
import com.hqyg.disjob.monitor.db.domain.PageResult;
import com.hqyg.disjob.monitor.db.dynamicsql.StatisticsSqlProvider.DBCondition;
import com.hqyg.disjob.monitor.db.dynamicsql.StatisticsSqlProvider.DBTable;
/**
* <pre>
*
* File: ScheduleJobController.java
*
* Copyright (c) 2016, globalegrow.com All Rights Reserved.
*
* Description:
* job执行明细控制器
*
* Revision History
*
* Date: 2016年5月19日
* Author: Disjob
*
* </pre>
*/
@Controller
@RequestMapping("/service/monitor")
public class JobMonitorController extends BaseController {
@Autowired
@Qualifier("jobBasicInfoService")
private DBJobBasicInfoService bservice;
@Autowired
@Qualifier("jobExeProgressService")
private DBJobExeProgressService pservice;
@Autowired
@Qualifier("statisticsService")
private DBStatisticsService sservice;
@Resource
private JobInfoService jobInfoService;
/*
* @RequestMapping("/jobDetail")
*
* @ResponseBody public List<DBJobBasicInfo>
* jobExeDetail(@RequestParam(value="groupName", required=true) String
* groupName,@RequestParam(value="jobName", required=true) String
* jobName,@RequestParam(value="page", required=true) int
* page,@RequestParam(value="rows", required=true) int rows) throws
* Exception {
* System.out.println("----------jobExeDetail-------------"+page+
* "----------"+rows); return bservice.findByGnameAndJname(groupName,
* jobName,1,100); }
*/
@RequestMapping("/stopJobExecute")
@ResponseBody
public Result pauseJobExecution(HttpSession session,
@RequestParam(value = "uuid", required = true) String uuid)
throws Exception {
// 1为成功,0任务不存在,2为任务状态不是exec,-1代表超时
Result res = new Result(false);
List<String> list = jobInfoService.KillTaskByRequestId(uuid);
if (list == null || list.size() == 0) {
res.setMsg("ejob命令发送或接收超时");
}
StringBuffer msg = new StringBuffer("");
List<Boolean> flag = new ArrayList<Boolean>();
for (String str : list) {
String[] array = str.split(":");
String ipPort = array[0];
int code = Integer.parseInt(array[1]);
msg.append(ipPort).append(":");
switch (code) {
case -1:
msg.append("超时").append(",");
break;
case 0:
msg.append("任务不存在").append(",");
break;
case 1:
flag.add(true);
// res.setSuccessful(true);
break;
case 2:
msg.append("任务状态不是exec").append(",");
break;
default:
msg.append("接口调用异常!").append(",");
break;
}
}
if (flag.size() == list.size()) {
res.setSuccessful(true);
} else {
res.setMsg(msg.toString().substring(0, msg.length() - 1));
}
AppHelper.accessLog(
session.getAttribute(SystemDefault.USER_SESSION_KEY),
"Kill Task By RequestId", uuid + "," + res.toString());
return res;
}
@RequestMapping("/restartJob")
@ResponseBody
public Result restartJobExecution(HttpSession session,
@RequestParam(value = "groupName", required = true) String groupName,
@RequestParam(value = "jobName", required = true) String jobName)
throws Exception {
// 1为成功,0任务不存在,2为任务状态不是exec,-1代表超时
Result res = new Result(false);
List<String> list = jobInfoService.restartJob(groupName,jobName);
if (list == null || list.size() == 0) {
res.setMsg("ejob命令发送或接收超时");
}
StringBuffer msg = new StringBuffer("");
List<Boolean> flag = new ArrayList<Boolean>();
for (String str : list) {
String[] array = str.split(":");
String ipPort = array[0];
int code = Integer.parseInt(array[1]);
msg.append(ipPort).append(":");
switch (code) {
case -1:
msg.append("超时").append(",");
break;
case 0:
msg.append("重启失败").append(",");
break;
case 1:
flag.add(true);
// res.setSuccessful(true);
break;
default:
msg.append("接口调用异常!").append(",");
break;
}
}
if (flag.size() == list.size()) {
res.setSuccessful(true);
} else {
res.setMsg(msg.toString().substring(0, msg.length() - 1));
}
AppHelper.accessLog(
session.getAttribute(SystemDefault.USER_SESSION_KEY),
"restart Task By groupName", groupName + ",jobName:"+jobName + " , "+ res.toString());
return res;
}
@RequestMapping("/jobDetailQuery")
@ResponseBody
public com.hqyg.disjob.monitor.db.domain.PageResult jobExeDetailQuery(
@RequestParam(value = "groupName", required = true) String groupName,
@RequestParam(value = "jobName", required = true) String jobName,
@RequestParam(value = "uuid", required = true) String uuid,
@RequestParam(value = "start", required = false) String startTime,
@RequestParam(value = "end", required = false) String endTime,
@RequestParam(value = "limit", required = true) int pageSize,
@RequestParam(value = "offset", required = true) int offset)
throws Exception {
// "asc", limit: 20, offset: 0}
List<DBJobBasicInfo> infos = null;
if (StringHandleUtil.isNoneEmpty(uuid)) {// 如果uuid不为null的话,优先查询uuid,否则查询日期段
DBJobBasicInfo info = bservice.findByUuid(uuid);
infos = new LinkedList<DBJobBasicInfo>();
long total = 0;
if (info != null) {
infos.add(info);
total = 1;
}
return new PageResult().setTotal(total).setRows(infos);
} else {
if (StringHandleUtil.isNoneEmpty(startTime)
|| StringHandleUtil.isNoneEmpty(endTime))// 如果起始时间、结束时间的查询不为null,则按时间查询
return bservice.findByTime(groupName, jobName, startTime,
endTime, offset, pageSize);
else
return bservice.findByGnameAndJname(groupName, jobName, offset,
pageSize);// 否则查询组和任务
}
}
// 转化
private DBCondition exchange(int type) {
switch (type) {
case 0:
return DBCondition.Today;
case 1:
return DBCondition.YesterDay;
case 2:
return DBCondition.Nearly7Days;
case 3:
return DBCondition.ThisMonth;
case 4:
return DBCondition.LastMonth;
case 5:
return DBCondition.ThisYear;
default:
return null;
}
}
@RequestMapping("/jobStatistics")
@ResponseBody
public Result jobExeStatistics(
@RequestParam(value = "groupName", required = true) String gName,
@RequestParam(value = "jobName", required = true) String jName,
@RequestParam(value = "id", required = true) int type)
throws Exception {
Result res = new Result(true);
List<String> sTime = new LinkedList<String>();// 日期
List<Integer> sSeries = new LinkedList<Integer>();// 成功
List<Integer> fSeries = new LinkedList<Integer>();// 失败
DBCondition condition = exchange(type);
int sSum = 0;
int fSum = 0;
if (condition != null) {
for (DBStatistics info : sservice.specificJob(gName, jName,
DBTable.JobBasicInfoTable, condition)) {
sTime.add(info.getTimeSeg());
sSum += info.getSuccessNum();
sSeries.add(sSum);
fSum += info.getFailNum();
fSeries.add(fSum);
}
} else {
AppHelper.errorLog(this.getClass(), new Exception("统计时无法解析时间段类型:"
+ type));
}
GsonOption option = new GsonOption();// 创建java数据转echarts的图表json
option.legend("失败次数", "成功次数");
option.title("失败总数:" + fSum + "\r\n成功总数:" + sSum);
option.tooltip().trigger(Trigger.axis);
TimeAxis xaxis = new TimeAxis();
xaxis.type(AxisType.category);
xaxis.boundaryGap(true);
xaxis.setData(sTime);
option.xAxis(xaxis);
CategoryAxis yAxis = new CategoryAxis();
yAxis.type(AxisType.value);
yAxis.axisLabel().formatter("{value} 次");
option.yAxis(yAxis);
Line fbar = new Line("失败次数");
fbar.setData(fSeries);
fbar.stack("sta");
fbar.itemStyle(new ItemStyle().normal(new Normal().color("red")));
Line sbar = new Line("成功次数");
sbar.setData(sSeries);
sbar.stack("sta");
sbar.itemStyle(new ItemStyle().normal(new Normal().color("green")));
/*
* Bar sbar = new Bar("成功次数"); sbar.setData(sSeries); sbar.stack("sta");
* Bar fbar = new Bar("失败次数"); fbar.setData(fSeries); fbar.stack("sta");
*/
option.series(fbar, sbar);
res.setData(option.toString());
return res;
}
@RequestMapping("/jobProgress")
@ResponseBody
public Result jobExeProgress(
@RequestParam(value = "uuid", required = true) String uuid,
@RequestParam(value = "type", required = true) String type)
throws Exception {
Result res = new Result(true);
int ctype = -1;
try {
ctype = Integer.parseInt(type);// 先进行验证
} catch (NumberFormatException e) {
AppHelper.errorLog(this.getClass(), e);
ctype = -1;
}
List<DBJobExeProgress> pinfos = pservice.findByUuid(uuid);
List<String> xData = new LinkedList<String>();
List<Long> xSeries = new LinkedList<Long>();
Long tmpSeries = (long) 0;
for (DBJobExeProgress info : pinfos) {// 把数据进行整合
xData.add(info.getDataTime());
if (info.getContent() != null)
try {
tmpSeries = Long.parseLong(info.getContent());
} catch (NumberFormatException e) {
AppHelper.errorLog(this.getClass(), e);
tmpSeries = (long) 0;
}
xSeries.add(tmpSeries);
}
if (ctype != -1 && xData.size() == 0)// 解决无数据但是有异常时显示不了问题--因为图表没有数据
xData.add("0");
if (ctype != -1 && xSeries.size() == 0)// 解决无数据但是有异常时显示不了问题--因为图表没有数据
xSeries.add((long) 0);
GsonOption option = new GsonOption();// 创建java数据转echarts的图表json
option.legend("执行次数");
option.toolbox().show(true)
.feature(new MagicType(Magic.line, Magic.bar));
option.tooltip().trigger(Trigger.axis)
.formatter("执行时间 : {b} <br/> 次数:{c}");
TimeAxis xaxis = new TimeAxis();
xaxis.type(AxisType.category);
xaxis.boundaryGap(false);
xaxis.setData(xData);
// xaxis.data("2016-07-07 01:41:23","2016-07-07 02:30:00","2016-07-07 03:51:06","2016-07-07 04:54:12","2016-07-07 05:32:45","2016-07-07 06:07:43","2016-07-07 07:17:43","2016-07-07 08:57:03");
option.xAxis(xaxis);
CategoryAxis yAxis = new CategoryAxis();
yAxis.type(AxisType.value);
yAxis.axisLabel().formatter("{value} 次");
option.yAxis(yAxis);
Line line = new Line();
line.smooth(true).name("执行次数").setData(xSeries);
setMarkPoint(ctype, uuid, line);
// line.smooth(true).name("执行次数").data(240, 330, 600, 1000, 1700, 2800,
// 3600,
// 5000).itemStyle().normal().lineStyle().shadowColor("rgba(0,0,0,0.4)");
option.series(line);
res.setData(option.toString());
return res;
}
private void setMarkPoint(int ctype, String uuid, Line line) {
if (ctype != -1) {
MarkPoint mp = new MarkPoint();
mp.itemStyle().normal().color("red");
mp.data(new Data("有执行异常,请注意!", ctype));
// mp.geoCoord("error", "20", "10");
line.markPoint(mp);
}
}
}