123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- package com.xxl.job.admin.service.impl;
- import com.xxl.job.admin.core.model.XxlJobGroup;
- import com.xxl.job.admin.core.model.XxlJobInfo;
- import com.xxl.job.admin.core.cron.CronExpression;
- import com.xxl.job.admin.core.model.XxlJobLogReport;
- import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
- import com.xxl.job.admin.core.thread.JobScheduleHelper;
- import com.xxl.job.admin.core.util.I18nUtil;
- import com.xxl.job.admin.dao.*;
- import com.xxl.job.admin.service.XxlJobService;
- import com.xxl.job.core.biz.model.ReturnT;
- import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
- import com.xxl.job.core.glue.GlueTypeEnum;
- import com.xxl.job.core.util.DateUtil;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.stereotype.Service;
- import javax.annotation.Resource;
- import java.text.MessageFormat;
- import java.text.ParseException;
- import java.util.*;
- /**
- * core job action for xxl-job
- * @author xuxueli 2016-5-28 15:30:33
- */
- @Service
- public class XxlJobServiceImpl implements XxlJobService {
- private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class);
- @Resource
- private XxlJobGroupDao xxlJobGroupDao;
- @Resource
- private XxlJobInfoDao xxlJobInfoDao;
- @Resource
- public XxlJobLogDao xxlJobLogDao;
- @Resource
- private XxlJobLogGlueDao xxlJobLogGlueDao;
- @Resource
- private XxlJobLogReportDao xxlJobLogReportDao;
-
- @Override
- public Map<String, Object> pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
- // page list
- List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
- int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
-
- // 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;
- }
- @Override
- public ReturnT<String> add(XxlJobInfo jobInfo) {
- // valid
- XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
- if (group == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose")+I18nUtil.getString("jobinfo_field_jobgroup")) );
- }
- if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid") );
- }
- if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) );
- }
- if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) );
- }
- if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) );
- }
- if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) );
- }
- if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype")+I18nUtil.getString("system_unvalid")) );
- }
- if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+"JobHandler") );
- }
- // fix "\r" in shell
- if (GlueTypeEnum.GLUE_SHELL==GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource()!=null) {
- jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r", ""));
- }
- // ChildJobId valid
- if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) {
- String[] childJobIds = jobInfo.getChildJobId().split(",");
- for (String childJobIdItem: childJobIds) {
- if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) {
- XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem));
- if (childJobInfo==null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem));
- }
- } else {
- return new ReturnT<String>(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem));
- }
- }
- // join , avoid "xxx,,"
- String temp = "";
- for (String item:childJobIds) {
- temp += item + ",";
- }
- temp = temp.substring(0, temp.length()-1);
- jobInfo.setChildJobId(temp);
- }
- // add in db
- jobInfo.setAddTime(new Date());
- jobInfo.setUpdateTime(new Date());
- jobInfo.setGlueUpdatetime(new Date());
- xxlJobInfoDao.save(jobInfo);
- if (jobInfo.getId() < 1) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) );
- }
- return new ReturnT<String>(String.valueOf(jobInfo.getId()));
- }
- private boolean isNumeric(String str){
- try {
- int result = Integer.valueOf(str);
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
- }
- @Override
- public ReturnT<String> update(XxlJobInfo jobInfo) {
- // valid
- if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid") );
- }
- if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) );
- }
- if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) );
- }
- if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) );
- }
- if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) );
- }
- // ChildJobId valid
- if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) {
- String[] childJobIds = jobInfo.getChildJobId().split(",");
- for (String childJobIdItem: childJobIds) {
- if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) {
- XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem));
- if (childJobInfo==null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem));
- }
- } else {
- return new ReturnT<String>(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem));
- }
- }
- // join , avoid "xxx,,"
- String temp = "";
- for (String item:childJobIds) {
- temp += item + ",";
- }
- temp = temp.substring(0, temp.length()-1);
- jobInfo.setChildJobId(temp);
- }
- // group valid
- XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup());
- if (jobGroup == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup")+I18nUtil.getString("system_unvalid")) );
- }
- // stage job info
- XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
- if (exists_jobInfo == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) );
- }
- // next trigger time (5s后生效,避开预读周期)
- long nextTriggerTime = exists_jobInfo.getTriggerNextTime();
- if (exists_jobInfo.getTriggerStatus() == 1 && !jobInfo.getJobCron().equals(exists_jobInfo.getJobCron()) ) {
- try {
- Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));
- if (nextValidTime == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_never_fire"));
- }
- nextTriggerTime = nextValidTime.getTime();
- } catch (ParseException e) {
- logger.error(e.getMessage(), e);
- return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
- }
- }
- exists_jobInfo.setJobGroup(jobInfo.getJobGroup());
- exists_jobInfo.setJobCron(jobInfo.getJobCron());
- exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
- exists_jobInfo.setAuthor(jobInfo.getAuthor());
- exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail());
- exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy());
- exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());
- exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());
- exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
- exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout());
- exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
- exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
- exists_jobInfo.setTriggerNextTime(nextTriggerTime);
- exists_jobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(exists_jobInfo);
- return ReturnT.SUCCESS;
- }
- @Override
- public ReturnT<String> remove(int id) {
- XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
- if (xxlJobInfo == null) {
- return ReturnT.SUCCESS;
- }
- xxlJobInfoDao.delete(id);
- xxlJobLogDao.delete(id);
- xxlJobLogGlueDao.deleteByJobId(id);
- return ReturnT.SUCCESS;
- }
- @Override
- public ReturnT<String> start(int id) {
- XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
- // next trigger time (5s后生效,避开预读周期)
- long nextTriggerTime = 0;
- try {
- Date nextValidTime = new CronExpression(xxlJobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));
- if (nextValidTime == null) {
- return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_never_fire"));
- }
- nextTriggerTime = nextValidTime.getTime();
- } catch (ParseException e) {
- logger.error(e.getMessage(), e);
- return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
- }
- xxlJobInfo.setTriggerStatus(1);
- xxlJobInfo.setTriggerLastTime(0);
- xxlJobInfo.setTriggerNextTime(nextTriggerTime);
- xxlJobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(xxlJobInfo);
- return ReturnT.SUCCESS;
- }
- @Override
- public ReturnT<String> stop(int id) {
- XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
- xxlJobInfo.setTriggerStatus(0);
- xxlJobInfo.setTriggerLastTime(0);
- xxlJobInfo.setTriggerNextTime(0);
- xxlJobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(xxlJobInfo);
- return ReturnT.SUCCESS;
- }
- @Override
- public Map<String, Object> dashboardInfo() {
- int jobInfoCount = xxlJobInfoDao.findAllCount();
- int jobLogCount = 0;
- int jobLogSuccessCount = 0;
- XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal();
- if (xxlJobLogReport != null) {
- jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount();
- jobLogSuccessCount = xxlJobLogReport.getSucCount();
- }
- // executor count
- Set<String> executorAddressSet = new HashSet<String>();
- List<XxlJobGroup> groupList = xxlJobGroupDao.findAll();
- if (groupList!=null && !groupList.isEmpty()) {
- for (XxlJobGroup group: groupList) {
- if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) {
- executorAddressSet.addAll(group.getRegistryList());
- }
- }
- }
- int executorCount = executorAddressSet.size();
- Map<String, Object> dashboardMap = new HashMap<String, Object>();
- dashboardMap.put("jobInfoCount", jobInfoCount);
- dashboardMap.put("jobLogCount", jobLogCount);
- dashboardMap.put("jobLogSuccessCount", jobLogSuccessCount);
- dashboardMap.put("executorCount", executorCount);
- return dashboardMap;
- }
- @Override
- public ReturnT<Map<String, Object>> chartInfo(Date startDate, Date endDate) {
- // process
- List<String> triggerDayList = new ArrayList<String>();
- List<Integer> triggerDayCountRunningList = new ArrayList<Integer>();
- List<Integer> triggerDayCountSucList = new ArrayList<Integer>();
- List<Integer> triggerDayCountFailList = new ArrayList<Integer>();
- int triggerCountRunningTotal = 0;
- int triggerCountSucTotal = 0;
- int triggerCountFailTotal = 0;
- List<XxlJobLogReport> logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate);
- if (logReportList!=null && logReportList.size()>0) {
- for (XxlJobLogReport item: logReportList) {
- String day = DateUtil.formatDate(item.getTriggerDay());
- int triggerDayCountRunning = item.getRunningCount();
- int triggerDayCountSuc = item.getSucCount();
- int triggerDayCountFail = item.getFailCount();
- triggerDayList.add(day);
- triggerDayCountRunningList.add(triggerDayCountRunning);
- triggerDayCountSucList.add(triggerDayCountSuc);
- triggerDayCountFailList.add(triggerDayCountFail);
- triggerCountRunningTotal += triggerDayCountRunning;
- triggerCountSucTotal += triggerDayCountSuc;
- triggerCountFailTotal += triggerDayCountFail;
- }
- } else {
- for (int i = -6; i <= 0; i++) {
- triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i)));
- triggerDayCountRunningList.add(0);
- triggerDayCountSucList.add(0);
- triggerDayCountFailList.add(0);
- }
- }
- Map<String, Object> result = new HashMap<String, Object>();
- result.put("triggerDayList", triggerDayList);
- result.put("triggerDayCountRunningList", triggerDayCountRunningList);
- result.put("triggerDayCountSucList", triggerDayCountSucList);
- result.put("triggerDayCountFailList", triggerDayCountFailList);
- result.put("triggerCountRunningTotal", triggerCountRunningTotal);
- result.put("triggerCountSucTotal", triggerCountSucTotal);
- result.put("triggerCountFailTotal", triggerCountFailTotal);
- return new ReturnT<Map<String, Object>>(result);
- }
- }
|