JobLogController.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package com.xxl.job.admin.controller;
  2. import com.xxl.job.admin.core.model.XxlJobGroup;
  3. import com.xxl.job.admin.core.model.XxlJobInfo;
  4. import com.xxl.job.admin.core.model.XxlJobLog;
  5. import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
  6. import com.xxl.job.admin.dao.XxlJobGroupDao;
  7. import com.xxl.job.admin.dao.XxlJobInfoDao;
  8. import com.xxl.job.admin.dao.XxlJobLogDao;
  9. import com.xxl.job.core.biz.ExecutorBiz;
  10. import com.xxl.job.core.biz.model.LogResult;
  11. import com.xxl.job.core.biz.model.ReturnT;
  12. import com.xxl.job.core.rpc.netcom.NetComClientProxy;
  13. import org.apache.commons.lang.StringUtils;
  14. import org.apache.commons.lang.time.DateUtils;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.stereotype.Controller;
  18. import org.springframework.ui.Model;
  19. import org.springframework.web.bind.annotation.RequestMapping;
  20. import org.springframework.web.bind.annotation.RequestParam;
  21. import org.springframework.web.bind.annotation.ResponseBody;
  22. import javax.annotation.Resource;
  23. import java.text.ParseException;
  24. import java.util.Date;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. /**
  29. * index controller
  30. * @author xuxueli 2015-12-19 16:13:16
  31. */
  32. @Controller
  33. @RequestMapping("/joblog")
  34. public class JobLogController {
  35. private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
  36. @Resource
  37. private XxlJobGroupDao xxlJobGroupDao;
  38. @Resource
  39. public XxlJobInfoDao xxlJobInfoDao;
  40. @Resource
  41. public XxlJobLogDao xxlJobLogDao;
  42. @RequestMapping
  43. public String index(Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
  44. // 执行器列表
  45. List<XxlJobGroup> jobGroupList = xxlJobGroupDao.findAll();
  46. model.addAttribute("JobGroupList", jobGroupList);
  47. // 任务
  48. if (jobId > 0) {
  49. XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
  50. model.addAttribute("jobInfo", jobInfo);
  51. }
  52. return "joblog/joblog.index";
  53. }
  54. @RequestMapping("/getJobsByGroup")
  55. @ResponseBody
  56. public ReturnT<List<XxlJobInfo>> getJobsByGroup(int jobGroup){
  57. List<XxlJobInfo> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
  58. return new ReturnT<List<XxlJobInfo>>(list);
  59. }
  60. @RequestMapping("/pageList")
  61. @ResponseBody
  62. public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,
  63. @RequestParam(required = false, defaultValue = "10") int length,
  64. int jobGroup, int jobId, int logStatus, String filterTime) {
  65. // parse param
  66. Date triggerTimeStart = null;
  67. Date triggerTimeEnd = null;
  68. if (StringUtils.isNotBlank(filterTime)) {
  69. String[] temp = filterTime.split(" - ");
  70. if (temp!=null && temp.length == 2) {
  71. try {
  72. triggerTimeStart = DateUtils.parseDate(temp[0], new String[]{"yyyy-MM-dd HH:mm:ss"});
  73. triggerTimeEnd = DateUtils.parseDate(temp[1], new String[]{"yyyy-MM-dd HH:mm:ss"});
  74. } catch (ParseException e) { }
  75. }
  76. }
  77. // page query
  78. List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
  79. int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
  80. // package result
  81. Map<String, Object> maps = new HashMap<String, Object>();
  82. maps.put("recordsTotal", list_count); // 总记录数
  83. maps.put("recordsFiltered", list_count); // 过滤后的总记录数
  84. maps.put("data", list); // 分页列表
  85. return maps;
  86. }
  87. @RequestMapping("/logDetailPage")
  88. public String logDetailPage(int id, Model model){
  89. // base check
  90. ReturnT<String> logStatue = ReturnT.SUCCESS;
  91. XxlJobLog jobLog = xxlJobLogDao.load(id);
  92. if (jobLog == null) {
  93. throw new RuntimeException("抱歉,日志ID非法.");
  94. }
  95. model.addAttribute("triggerCode", jobLog.getTriggerCode());
  96. model.addAttribute("handleCode", jobLog.getHandleCode());
  97. model.addAttribute("executorAddress", jobLog.getExecutorAddress());
  98. model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime());
  99. model.addAttribute("logId", jobLog.getId());
  100. return "joblog/joblog.detail";
  101. }
  102. @RequestMapping("/logDetailCat")
  103. @ResponseBody
  104. public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, int logId, int fromLineNum){
  105. try {
  106. ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, executorAddress, XxlJobDynamicScheduler.getAccessToken()).getObject();
  107. ReturnT<LogResult> logResult = executorBiz.log(triggerTime, logId, fromLineNum);
  108. // is end
  109. if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
  110. XxlJobLog jobLog = xxlJobLogDao.load(logId);
  111. if (jobLog.getHandleCode() > 0) {
  112. logResult.getContent().setEnd(true);
  113. }
  114. }
  115. return logResult;
  116. } catch (Exception e) {
  117. logger.error(e.getMessage(), e);
  118. return new ReturnT<LogResult>(ReturnT.FAIL_CODE, e.getMessage());
  119. }
  120. }
  121. @RequestMapping("/logKill")
  122. @ResponseBody
  123. public ReturnT<String> logKill(int id){
  124. // base check
  125. XxlJobLog log = xxlJobLogDao.load(id);
  126. XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
  127. if (jobInfo==null) {
  128. return new ReturnT<String>(500, "参数异常");
  129. }
  130. if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
  131. return new ReturnT<String>(500, "调度失败,无法终止日志");
  132. }
  133. // request of kill
  134. ReturnT<String> runResult = null;
  135. try {
  136. ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, log.getExecutorAddress(), XxlJobDynamicScheduler.getAccessToken()).getObject();
  137. runResult = executorBiz.kill(jobInfo.getId());
  138. } catch (Exception e) {
  139. logger.error(e.getMessage(), e);
  140. runResult = new ReturnT<String>(500, e.getMessage());
  141. }
  142. if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
  143. log.setHandleCode(ReturnT.FAIL_CODE);
  144. log.setHandleMsg("人为操作主动终止:" + (runResult.getMsg()!=null?runResult.getMsg():""));
  145. log.setHandleTime(new Date());
  146. xxlJobLogDao.updateHandleInfo(log);
  147. return new ReturnT<String>(runResult.getMsg());
  148. } else {
  149. return new ReturnT<String>(500, runResult.getMsg());
  150. }
  151. }
  152. @RequestMapping("/clearLog")
  153. @ResponseBody
  154. public ReturnT<String> clearLog(int jobGroup, int jobId, int type){
  155. Date clearBeforeTime = null;
  156. int clearBeforeNum = 0;
  157. if (type == 1) {
  158. clearBeforeTime = DateUtils.addMonths(new Date(), -1); // 清理一个月之前日志数据
  159. } else if (type == 2) {
  160. clearBeforeTime = DateUtils.addMonths(new Date(), -3); // 清理三个月之前日志数据
  161. } else if (type == 3) {
  162. clearBeforeTime = DateUtils.addMonths(new Date(), -6); // 清理六个月之前日志数据
  163. } else if (type == 4) {
  164. clearBeforeTime = DateUtils.addYears(new Date(), -1); // 清理一年之前日志数据
  165. } else if (type == 5) {
  166. clearBeforeNum = 1000; // 清理一千条以前日志数据
  167. } else if (type == 6) {
  168. clearBeforeNum = 10000; // 清理一万条以前日志数据
  169. } else if (type == 7) {
  170. clearBeforeNum = 30000; // 清理三万条以前日志数据
  171. } else if (type == 8) {
  172. clearBeforeNum = 100000; // 清理十万条以前日志数据
  173. } else if (type == 9) {
  174. clearBeforeNum = 0; // 清理所用日志数据
  175. } else {
  176. return new ReturnT<String>(ReturnT.FAIL_CODE, "清理类型参数异常");
  177. }
  178. xxlJobLogDao.clearLog(jobGroup, jobId, clearBeforeTime, clearBeforeNum);
  179. return ReturnT.SUCCESS;
  180. }
  181. }