package com.hqyg.disjob.console.web.controller; import java.util.LinkedList; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; 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 org.springframework.web.servlet.ModelAndView; import com.hqyg.disjob.common.exception.EjobCronException; import com.hqyg.disjob.common.exception.ZKNodeException2; 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.cron.CronResult; import com.hqyg.disjob.console.cron.CronTransferUtil; import com.hqyg.disjob.console.util.AppHelper; import com.hqyg.disjob.console.util.CronExpression; import com.hqyg.disjob.console.util.CronUtils; import com.hqyg.disjob.register.domain.CronInfo; import com.hqyg.disjob.register.domain.Job; import com.hqyg.disjob.register.job.JobOperationService; import com.google.gson.Gson; import com.hqyg.disjob.monitor.db.domain.DBUser; import com.hqyg.disjob.monitor.db.domain.PageResultAndCategories; /** * <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/job/info") public class JobInfoController extends BaseController { @Resource private JobOperationService jobOperationService; @RequestMapping("/list") @ResponseBody public List<Job> list() { return null; } @RequestMapping("/jobExecution") @ResponseBody public Result jobExecution(@RequestParam(value="jobName", required=true) String jobName,@RequestParam(value="groupName", required=true) String groupName) throws Exception { Result res = new Result(true); Job job = this.jobOperationService.getJobByGroupAndJobName(groupName, jobName); if(job != null && job.getExe() != null){ res.setData(job.getExe()); }else{ res.setSuccessful(false); } return res; } @RequestMapping("/search") @ResponseBody public PageResultAndCategories search(@RequestParam(value="groupName", required=true) String groupName, @RequestParam(value="category", required=false) String category) { PageResultAndCategories pac = new PageResultAndCategories(); if(StringUtils.isEmpty(groupName)){ pac.setTotal(0).setRows(new LinkedList<Job>()); return pac; } pac = this.jobOperationService.getJobListByGroupAndCategory(groupName,category); return pac; } @RequestMapping("/update") @ResponseBody public Result update(HttpSession session,Job job) throws Exception { String pageCron = job.getCronExpression(); if(pageCron.trim().split(CronUtils.SPACE).length == 5 || pageCron.trim().split(CronUtils.SPACE).length == 1){ CronResult transferResult = CronTransferUtil.fromCrontabToQuartz(pageCron); if(transferResult.isTransferSuccess()){ job.setCronExpression(transferResult.getQuartzCronExpression()); }else{ return new Result(false,"输入的表达式不合法"); } } if(!CronExpression.isValidExpression(job.getCronExpression())) return new Result(false,"请输入正确的cron表达式"); if(this.jobOperationService.updateJob(job)){ AppHelper.accessLog(session.getAttribute(SystemDefault.USER_SESSION_KEY), "update", job.toString()); return new Result(); }else return new Result(false,"更新任务参数失败"); } @RequestMapping("/pause") @ResponseBody public Result pause(HttpSession session,Job job) throws Exception { job.setCronExpression(StringHandleUtil.deleteExtraSpaceRegular(job.getCronExpression()));//去除多余的空格 if(this.jobOperationService.suspendJob(job)){ AppHelper.accessLog(session.getAttribute(SystemDefault.USER_SESSION_KEY), "pause", job.toString()); return new Result(); }else return new Result(false,"暂停任务失败"); } @RequestMapping("/resume") @ResponseBody public Result resume(HttpSession session,Job job) throws Exception { job.setCronExpression(StringHandleUtil.deleteExtraSpaceRegular(job.getCronExpression()));//去除多余的空格 if(this.jobOperationService.resumeJob(job)){ AppHelper.accessLog(session.getAttribute(SystemDefault.USER_SESSION_KEY), "resume", job.toString()); return new Result(); }else return new Result(false,"恢复任务失败"); } @RequestMapping("/batchHandle") @ResponseBody public Result batch(HttpSession session,@RequestParam(value="type", required=true) int type,@RequestParam(value="groupName", required=true) String gName,@RequestParam(value="jobNames", required=true) String jNames) throws Exception { if(StringUtils.isNoneEmpty(gName) && StringUtils.isNoneEmpty(jNames)) return batchHandle(session,type,gName,jNames); return new Result(false,"无效的参数!"); } private Result batchHandle(HttpSession session,int type,String gName,String jNames){ Job job = null; List<String> jobFaults = new LinkedList<>(); String[] jobArray = jNames.split(","); boolean haveFault = false; String batchFlag = null; switch(type){ case 0://暂停 batchFlag = "暂停"; for(String jobName:jobArray){ job = new Job(); job.setGroupName(gName); job.setJobName(jobName); if(this.jobOperationService.suspendJob(job)){ AppHelper.accessLog(session.getAttribute(SystemDefault.USER_SESSION_KEY), "batch pause", job.toString()); }else{ haveFault = true; jobFaults.add(jobName); } } break; case 1://恢复 batchFlag = "恢复"; for(String jobName:jobArray){ job = new Job(); job.setGroupName(gName); job.setJobName(jobName); if(this.jobOperationService.resumeJob(job)){ AppHelper.accessLog(session.getAttribute(SystemDefault.USER_SESSION_KEY), "batch resume", job.toString()); }else{ haveFault = true; jobFaults.add(jobName); } } break; default: return new Result(false,"无效的批量操作!"); } if(haveFault) new Result(false,jobFaults.toString()+",如上任务执行-"+batchFlag+"-失败!"); return new Result(); } @RequestMapping("/divideJob") @ResponseBody public Result divideJob() { Result back = new Result(false); try { int res = jobOperationService.averageDistributeSlaveJob(); switch(res){ case 0://成功不做任务处理 back.setSuccessful(true); break; case 1: back.setMsg("失败:集群中在线的job节点少于2!"); break; default: back.setMsg("失败:未知!"); break; } } catch (Exception e1) { back.setMsg("失败:"+e1.getMessage()); AppHelper.errorLog(this.getClass(), e1); } return back; } @RequestMapping("/fireNow") @ResponseBody public Result firenow(@RequestParam(value="jobName", required=true) String jobName, @RequestParam(value="jobGroup", required=true) String jobGroup) { try { jobOperationService.fireNow(jobGroup, jobName); } catch (Exception e) { return new Result(e.getMessage()); } return new Result(); } //新的界面编辑 @RequestMapping("/jobDetailInfo") public ModelAndView jobDetailInfo(@RequestParam(value="groupName", required=false) String groupName, @RequestParam(value="jobName", required=false) String jobName, @RequestParam(value="method", required=false) String method) { if("addNew".equals(method)){ ModelAndView mav = new ModelAndView("job/jobDetailInfo"); mav.addObject("job", new Job()); return mav; } ModelAndView mav; Job job = jobOperationService.getJobByGroupAndJobName(groupName, jobName); try { //校验是否能够转换, 跳转到不同的页面 CronUtils.transferFromCronExpression(job.getCronExpression()); mav = new ModelAndView("job/jobDetailInfo"); } catch (EjobCronException e) { mav = new ModelAndView("job/jobSimpleDetailInfo"); } mav.addObject(job); return mav; } /** * jobDetail 保存操作 * @return */ @RequestMapping("/saveJobDetail") @ResponseBody public Result saveJob(@RequestParam(value="job", required=true) String jobInfo, @RequestParam(value="cron", required=false) String cronInfo, @RequestParam(value="method", required=false) String method, HttpSession session){ Job job = new Gson().fromJson(jobInfo, Job.class); if(!StringUtils.isEmpty(cronInfo)){ CronInfo cron = new Gson().fromJson(cronInfo, CronInfo.class); job.setCronExpression(CronUtils.transferToCronExpression(cron)); } String pageCron = job.getCronExpression(); if(pageCron.trim().split(CronUtils.SPACE).length == 5 || pageCron.trim().split(CronUtils.SPACE).length == 1){ CronResult transferResult = CronTransferUtil.fromCrontabToQuartz(pageCron); if(transferResult.isTransferSuccess()){ job.setCronExpression(transferResult.getQuartzCronExpression()); }else{ return new Result(false,"输入的表达式不合法"); } } if("addNew".equals(method)){ Result result = new Result(); try { job.setJobStatus(0); DBUser user = (DBUser) session.getAttribute(SystemDefault.USER_SESSION_KEY); result.setSuccessful(jobOperationService.addJob(job, user.getUsername())); } catch (ZKNodeException2 e) { result.setSuccessful(false); result.setMsg(e.getMessage()); } return result; } return new Result(jobOperationService.updateJob(job)); } @RequestMapping("/jobAddNew") public ModelAndView jobAddnewPage() { ModelAndView mav = new ModelAndView("job/jobDetailInfo"); mav.addObject("job", new Job()); return mav; } }