JobLogController.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package com.xxl.job.admin.controller;
  2. import com.xxl.job.admin.core.exception.XxlJobException;
  3. import com.xxl.job.admin.core.complete.XxlJobCompleter;
  4. import com.xxl.job.admin.core.model.XxlJobGroup;
  5. import com.xxl.job.admin.core.model.XxlJobInfo;
  6. import com.xxl.job.admin.core.model.XxlJobLog;
  7. import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
  8. import com.xxl.job.admin.core.util.I18nUtil;
  9. import com.xxl.job.admin.dao.XxlJobGroupDao;
  10. import com.xxl.job.admin.dao.XxlJobInfoDao;
  11. import com.xxl.job.admin.dao.XxlJobLogDao;
  12. import com.xxl.job.core.biz.ExecutorBiz;
  13. import com.xxl.job.core.biz.model.KillParam;
  14. import com.xxl.job.core.biz.model.LogParam;
  15. import com.xxl.job.core.biz.model.LogResult;
  16. import com.xxl.job.core.biz.model.ReturnT;
  17. import com.xxl.job.core.util.DateUtil;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.stereotype.Controller;
  21. import org.springframework.ui.Model;
  22. import org.springframework.web.bind.annotation.RequestMapping;
  23. import org.springframework.web.bind.annotation.RequestParam;
  24. import org.springframework.web.bind.annotation.ResponseBody;
  25. import javax.annotation.Resource;
  26. import javax.servlet.http.HttpServletRequest;
  27. import java.util.Date;
  28. import java.util.HashMap;
  29. import java.util.List;
  30. import java.util.Map;
  31. /**
  32. * index controller
  33. * @author xuxueli 2015-12-19 16:13:16
  34. */
  35. @Controller
  36. @RequestMapping("/joblog")
  37. public class JobLogController {
  38. private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
  39. @Resource
  40. private XxlJobGroupDao xxlJobGroupDao;
  41. @Resource
  42. public XxlJobInfoDao xxlJobInfoDao;
  43. @Resource
  44. public XxlJobLogDao xxlJobLogDao;
  45. @RequestMapping
  46. public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
  47. // 执行器列表
  48. List<XxlJobGroup> jobGroupList_all = xxlJobGroupDao.findAll();
  49. // filter group
  50. List<XxlJobGroup> jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all);
  51. if (jobGroupList==null || jobGroupList.size()==0) {
  52. throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
  53. }
  54. model.addAttribute("JobGroupList", jobGroupList);
  55. // 任务
  56. if (jobId > 0) {
  57. XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
  58. if (jobInfo == null) {
  59. throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid"));
  60. }
  61. model.addAttribute("jobInfo", jobInfo);
  62. // valid permission
  63. JobInfoController.validPermission(request, jobInfo.getJobGroup());
  64. }
  65. return "joblog/joblog.index";
  66. }
  67. @RequestMapping("/getJobsByGroup")
  68. @ResponseBody
  69. public ReturnT<List<XxlJobInfo>> getJobsByGroup(int jobGroup){
  70. List<XxlJobInfo> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
  71. return new ReturnT<List<XxlJobInfo>>(list);
  72. }
  73. @RequestMapping("/pageList")
  74. @ResponseBody
  75. public Map<String, Object> pageList(HttpServletRequest request,
  76. @RequestParam(required = false, defaultValue = "0") int start,
  77. @RequestParam(required = false, defaultValue = "10") int length,
  78. int jobGroup, int jobId, int logStatus, String filterTime) {
  79. // valid permission
  80. JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup
  81. // parse param
  82. Date triggerTimeStart = null;
  83. Date triggerTimeEnd = null;
  84. if (filterTime!=null && filterTime.trim().length()>0) {
  85. String[] temp = filterTime.split(" - ");
  86. if (temp.length == 2) {
  87. triggerTimeStart = DateUtil.parseDateTime(temp[0]);
  88. triggerTimeEnd = DateUtil.parseDateTime(temp[1]);
  89. }
  90. }
  91. // page query
  92. List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
  93. int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
  94. // package result
  95. Map<String, Object> maps = new HashMap<String, Object>();
  96. maps.put("recordsTotal", list_count); // 总记录数
  97. maps.put("recordsFiltered", list_count); // 过滤后的总记录数
  98. maps.put("data", list); // 分页列表
  99. return maps;
  100. }
  101. @RequestMapping("/logDetailPage")
  102. public String logDetailPage(int id, Model model){
  103. // base check
  104. ReturnT<String> logStatue = ReturnT.SUCCESS;
  105. XxlJobLog jobLog = xxlJobLogDao.load(id);
  106. if (jobLog == null) {
  107. throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid"));
  108. }
  109. model.addAttribute("triggerCode", jobLog.getTriggerCode());
  110. model.addAttribute("handleCode", jobLog.getHandleCode());
  111. model.addAttribute("executorAddress", jobLog.getExecutorAddress());
  112. model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime());
  113. model.addAttribute("logId", jobLog.getId());
  114. return "joblog/joblog.detail";
  115. }
  116. @RequestMapping("/logDetailCat")
  117. @ResponseBody
  118. public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){
  119. try {
  120. ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
  121. ReturnT<LogResult> logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum));
  122. // is end
  123. if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
  124. XxlJobLog jobLog = xxlJobLogDao.load(logId);
  125. if (jobLog.getHandleCode() > 0) {
  126. logResult.getContent().setEnd(true);
  127. }
  128. }
  129. return logResult;
  130. } catch (Exception e) {
  131. logger.error(e.getMessage(), e);
  132. return new ReturnT<LogResult>(ReturnT.FAIL_CODE, e.getMessage());
  133. }
  134. }
  135. @RequestMapping("/logKill")
  136. @ResponseBody
  137. public ReturnT<String> logKill(int id){
  138. // base check
  139. XxlJobLog log = xxlJobLogDao.load(id);
  140. XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
  141. if (jobInfo==null) {
  142. return new ReturnT<String>(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
  143. }
  144. if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
  145. return new ReturnT<String>(500, I18nUtil.getString("joblog_kill_log_limit"));
  146. }
  147. // request of kill
  148. ReturnT<String> runResult = null;
  149. try {
  150. ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
  151. runResult = executorBiz.kill(new KillParam(jobInfo.getId()));
  152. } catch (Exception e) {
  153. logger.error(e.getMessage(), e);
  154. runResult = new ReturnT<String>(500, e.getMessage());
  155. }
  156. if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
  157. log.setHandleCode(ReturnT.FAIL_CODE);
  158. log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():""));
  159. log.setHandleTime(new Date());
  160. XxlJobCompleter.updateHandleInfoAndFinish(log);
  161. return new ReturnT<String>(runResult.getMsg());
  162. } else {
  163. return new ReturnT<String>(500, runResult.getMsg());
  164. }
  165. }
  166. @RequestMapping("/clearLog")
  167. @ResponseBody
  168. public ReturnT<String> clearLog(int jobGroup, int jobId, int type){
  169. Date clearBeforeTime = null;
  170. int clearBeforeNum = 0;
  171. if (type == 1) {
  172. clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据
  173. } else if (type == 2) {
  174. clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据
  175. } else if (type == 3) {
  176. clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据
  177. } else if (type == 4) {
  178. clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据
  179. } else if (type == 5) {
  180. clearBeforeNum = 1000; // 清理一千条以前日志数据
  181. } else if (type == 6) {
  182. clearBeforeNum = 10000; // 清理一万条以前日志数据
  183. } else if (type == 7) {
  184. clearBeforeNum = 30000; // 清理三万条以前日志数据
  185. } else if (type == 8) {
  186. clearBeforeNum = 100000; // 清理十万条以前日志数据
  187. } else if (type == 9) {
  188. clearBeforeNum = 0; // 清理所有日志数据
  189. } else {
  190. return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid"));
  191. }
  192. List<Long> logIds = null;
  193. do {
  194. logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000);
  195. if (logIds!=null && logIds.size()>0) {
  196. xxlJobLogDao.clearLog(logIds);
  197. }
  198. } while (logIds!=null && logIds.size()>0);
  199. return ReturnT.SUCCESS;
  200. }
  201. }