疯狂的狮子Li
2023-01-13 0fc796b90d3f44b81ef30285edb897223df439f7
ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
@@ -24,8 +24,8 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -33,201 +33,202 @@
/**
 * index controller
 *
 * @author xuxueli 2015-12-19 16:13:16
 */
@Controller
@RequestMapping("/joblog")
public class JobLogController {
   private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
    private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
   @Resource
   private XxlJobGroupDao xxlJobGroupDao;
   @Resource
   public XxlJobInfoDao xxlJobInfoDao;
   @Resource
   public XxlJobLogDao xxlJobLogDao;
    @Resource
    private XxlJobGroupDao xxlJobGroupDao;
    @Resource
    public XxlJobInfoDao xxlJobInfoDao;
    @Resource
    public XxlJobLogDao xxlJobLogDao;
   @RequestMapping
   public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
    @RequestMapping
    public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
      // 执行器列表
      List<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();
        // 执行器列表
        List<XxlJobGroup> jobGroupList_all = xxlJobGroupDao.findAll();
      // filter group
      List<XxlJobGroup> jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all);
      if (jobGroupList==null || jobGroupList.size()==0) {
         throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
      }
        // filter group
        List<XxlJobGroup> jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all);
        if (jobGroupList == null || jobGroupList.size() == 0) {
            throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
        }
      model.addAttribute("JobGroupList", jobGroupList);
        model.addAttribute("JobGroupList", jobGroupList);
      // 任务
      if (jobId > 0) {
         XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
         if (jobInfo == null) {
            throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid"));
         }
        // 任务
        if (jobId > 0) {
            XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
            if (jobInfo == null) {
                throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid"));
            }
         model.addAttribute("jobInfo", jobInfo);
            model.addAttribute("jobInfo", jobInfo);
         // valid permission
         JobInfoController.validPermission(request, jobInfo.getJobGroup());
      }
            // valid permission
            JobInfoController.validPermission(request, jobInfo.getJobGroup());
        }
      return "joblog/joblog.index";
   }
        return "joblog/joblog.index";
    }
   @RequestMapping("/getJobsByGroup")
   @ResponseBody
   public ReturnT<List<XxlJobInfo>> getJobsByGroup(int jobGroup){
      List<XxlJobInfo> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
      return new ReturnT<List<XxlJobInfo>>(list);
   }
   @RequestMapping("/pageList")
   @ResponseBody
   public Map<String, Object> pageList(HttpServletRequest request,
                              @RequestParam(required = false, defaultValue = "0") int start,
                              @RequestParam(required = false, defaultValue = "10") int length,
                              int jobGroup, int jobId, int logStatus, String filterTime) {
    @RequestMapping("/getJobsByGroup")
    @ResponseBody
    public ReturnT<List<XxlJobInfo>> getJobsByGroup(int jobGroup) {
        List<XxlJobInfo> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
        return new ReturnT<List<XxlJobInfo>>(list);
    }
      // valid permission
      JobInfoController.validPermission(request, jobGroup);   // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup
      // parse param
      Date triggerTimeStart = null;
      Date triggerTimeEnd = null;
      if (filterTime!=null && filterTime.trim().length()>0) {
         String[] temp = filterTime.split(" - ");
         if (temp.length == 2) {
            triggerTimeStart = DateUtil.parseDateTime(temp[0]);
            triggerTimeEnd = DateUtil.parseDateTime(temp[1]);
         }
      }
      // page query
      List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
      int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
      // package result
      Map<String, Object> maps = new HashMap<String, Object>();
       maps.put("recordsTotal", list_count);      // 总记录数
       maps.put("recordsFiltered", list_count);   // 过滤后的总记录数
       maps.put("data", list);                 // 分页列表
      return maps;
   }
    @RequestMapping("/pageList")
    @ResponseBody
    public Map<String, Object> pageList(HttpServletRequest request,
                                        @RequestParam(required = false, defaultValue = "0") int start,
                                        @RequestParam(required = false, defaultValue = "10") int length,
                                        int jobGroup, int jobId, int logStatus, String filterTime) {
   @RequestMapping("/logDetailPage")
   public String logDetailPage(int id, Model model){
        // valid permission
        JobInfoController.validPermission(request, jobGroup);    // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup
      // base check
      ReturnT<String> logStatue = ReturnT.SUCCESS;
      XxlJobLog jobLog = xxlJobLogDao.load(id);
      if (jobLog == null) {
        // parse param
        Date triggerTimeStart = null;
        Date triggerTimeEnd = null;
        if (filterTime != null && filterTime.trim().length() > 0) {
            String[] temp = filterTime.split(" - ");
            if (temp.length == 2) {
                triggerTimeStart = DateUtil.parseDateTime(temp[0]);
                triggerTimeEnd = DateUtil.parseDateTime(temp[1]);
            }
        }
        // page query
        List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
        int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
        // package result
        Map<String, Object> maps = new HashMap<String, Object>();
        maps.put("recordsTotal", list_count);        // 总记录数
        maps.put("recordsFiltered", list_count);    // 过滤后的总记录数
        maps.put("data", list);                    // 分页列表
        return maps;
    }
    @RequestMapping("/logDetailPage")
    public String logDetailPage(int id, Model model) {
        // base check
        ReturnT<String> logStatue = ReturnT.SUCCESS;
        XxlJobLog jobLog = xxlJobLogDao.load(id);
        if (jobLog == null) {
            throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid"));
      }
        }
        model.addAttribute("triggerCode", jobLog.getTriggerCode());
        model.addAttribute("handleCode", jobLog.getHandleCode());
        model.addAttribute("executorAddress", jobLog.getExecutorAddress());
        model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime());
        model.addAttribute("logId", jobLog.getId());
      return "joblog/joblog.detail";
   }
        return "joblog/joblog.detail";
    }
   @RequestMapping("/logDetailCat")
   @ResponseBody
   public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){
      try {
         ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
         ReturnT<LogResult> logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum));
    @RequestMapping("/logDetailCat")
    @ResponseBody
    public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) {
        try {
            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
            ReturnT<LogResult> logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum));
         // is end
            if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
            // is end
            if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
                XxlJobLog jobLog = xxlJobLogDao.load(logId);
                if (jobLog.getHandleCode() > 0) {
                    logResult.getContent().setEnd(true);
                }
            }
         return logResult;
      } catch (Exception e) {
         logger.error(e.getMessage(), e);
         return new ReturnT<LogResult>(ReturnT.FAIL_CODE, e.getMessage());
      }
   }
            return logResult;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return new ReturnT<LogResult>(ReturnT.FAIL_CODE, e.getMessage());
        }
    }
   @RequestMapping("/logKill")
   @ResponseBody
   public ReturnT<String> logKill(int id){
      // base check
      XxlJobLog log = xxlJobLogDao.load(id);
      XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
      if (jobInfo==null) {
         return new ReturnT<String>(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
      }
      if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
         return new ReturnT<String>(500, I18nUtil.getString("joblog_kill_log_limit"));
      }
    @RequestMapping("/logKill")
    @ResponseBody
    public ReturnT<String> logKill(int id) {
        // base check
        XxlJobLog log = xxlJobLogDao.load(id);
        XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
        if (jobInfo == null) {
            return new ReturnT<String>(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
        }
        if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
            return new ReturnT<String>(500, I18nUtil.getString("joblog_kill_log_limit"));
        }
      // request of kill
      ReturnT<String> runResult = null;
      try {
         ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
         runResult = executorBiz.kill(new KillParam(jobInfo.getId()));
      } catch (Exception e) {
         logger.error(e.getMessage(), e);
         runResult = new ReturnT<String>(500, e.getMessage());
      }
        // request of kill
        ReturnT<String> runResult = null;
        try {
            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
            runResult = executorBiz.kill(new KillParam(jobInfo.getId()));
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            runResult = new ReturnT<String>(500, e.getMessage());
        }
      if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
         log.setHandleCode(ReturnT.FAIL_CODE);
         log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():""));
         log.setHandleTime(new Date());
         XxlJobCompleter.updateHandleInfoAndFinish(log);
         return new ReturnT<String>(runResult.getMsg());
      } else {
         return new ReturnT<String>(500, runResult.getMsg());
      }
   }
        if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
            log.setHandleCode(ReturnT.FAIL_CODE);
            log.setHandleMsg(I18nUtil.getString("joblog_kill_log_byman") + ":" + (runResult.getMsg() != null ? runResult.getMsg() : ""));
            log.setHandleTime(new Date());
            XxlJobCompleter.updateHandleInfoAndFinish(log);
            return new ReturnT<String>(runResult.getMsg());
        } else {
            return new ReturnT<String>(500, runResult.getMsg());
        }
    }
   @RequestMapping("/clearLog")
   @ResponseBody
   public ReturnT<String> clearLog(int jobGroup, int jobId, int type){
    @RequestMapping("/clearLog")
    @ResponseBody
    public ReturnT<String> clearLog(int jobGroup, int jobId, int type) {
      Date clearBeforeTime = null;
      int clearBeforeNum = 0;
      if (type == 1) {
         clearBeforeTime = DateUtil.addMonths(new Date(), -1);   // 清理一个月之前日志数据
      } else if (type == 2) {
         clearBeforeTime = DateUtil.addMonths(new Date(), -3);   // 清理三个月之前日志数据
      } else if (type == 3) {
         clearBeforeTime = DateUtil.addMonths(new Date(), -6);   // 清理六个月之前日志数据
      } else if (type == 4) {
         clearBeforeTime = DateUtil.addYears(new Date(), -1);   // 清理一年之前日志数据
      } else if (type == 5) {
         clearBeforeNum = 1000;      // 清理一千条以前日志数据
      } else if (type == 6) {
         clearBeforeNum = 10000;      // 清理一万条以前日志数据
      } else if (type == 7) {
         clearBeforeNum = 30000;      // 清理三万条以前日志数据
      } else if (type == 8) {
         clearBeforeNum = 100000;   // 清理十万条以前日志数据
      } else if (type == 9) {
         clearBeforeNum = 0;         // 清理所有日志数据
      } else {
         return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid"));
      }
        Date clearBeforeTime = null;
        int clearBeforeNum = 0;
        if (type == 1) {
            clearBeforeTime = DateUtil.addMonths(new Date(), -1);    // 清理一个月之前日志数据
        } else if (type == 2) {
            clearBeforeTime = DateUtil.addMonths(new Date(), -3);    // 清理三个月之前日志数据
        } else if (type == 3) {
            clearBeforeTime = DateUtil.addMonths(new Date(), -6);    // 清理六个月之前日志数据
        } else if (type == 4) {
            clearBeforeTime = DateUtil.addYears(new Date(), -1);    // 清理一年之前日志数据
        } else if (type == 5) {
            clearBeforeNum = 1000;        // 清理一千条以前日志数据
        } else if (type == 6) {
            clearBeforeNum = 10000;        // 清理一万条以前日志数据
        } else if (type == 7) {
            clearBeforeNum = 30000;        // 清理三万条以前日志数据
        } else if (type == 8) {
            clearBeforeNum = 100000;    // 清理十万条以前日志数据
        } else if (type == 9) {
            clearBeforeNum = 0;            // 清理所有日志数据
        } else {
            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid"));
        }
      List<Long> logIds = null;
      do {
         logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000);
         if (logIds!=null && logIds.size()>0) {
            xxlJobLogDao.clearLog(logIds);
         }
      } while (logIds!=null && logIds.size()>0);
        List<Long> logIds = null;
        do {
            logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000);
            if (logIds != null && logIds.size() > 0) {
                xxlJobLogDao.clearLog(logIds);
            }
        } while (logIds != null && logIds.size() > 0);
      return ReturnT.SUCCESS;
   }
        return ReturnT.SUCCESS;
    }
}