package org.springblade.xxljob.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xxl.job.core.biz.model.ReturnT; import org.springblade.core.log.exception.ServiceException; import org.springblade.xxljob.cron.CronExpression; import org.springblade.xxljob.entity.JobInfoEntity; import org.springblade.xxljob.vo.JobInfoVO; import org.springblade.xxljob.mapper.JobInfoMapper; import org.springblade.xxljob.service.IJobInfoService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.metadata.IPage; import java.util.Date; /** * 调度任务信息表 服务实现类 * * @author BladeX * @since 2024-01-10 */ @Service public class JobInfoServiceImpl extends ServiceImpl implements IJobInfoService { public static final long PRE_READ_MS = 5000; // pre read @Override public IPage selectJobInfoPage(IPage page, JobInfoVO jobInfo) { return page.setRecords(baseMapper.selectJobInfoPage(page, jobInfo)); } /** * 更新任务 * @param jobInfo * @return */ @Override public boolean updateJob(JobInfoEntity jobInfo) { boolean flag = false; // 获取最新任务信息 JobInfoEntity exists_jobInfo = getById(jobInfo.getId()); // next trigger time (5s后生效,避开预读周期) long nextTriggerTime = jobInfo.getTriggerNextTime(); boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { try { Date nextValidTime = generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + PRE_READ_MS)); if (nextValidTime == null) { return false; } nextTriggerTime = nextValidTime.getTime(); } catch (Exception e) { return false; } } exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); exists_jobInfo.setAuthor(jobInfo.getAuthor()); exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); 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()); // 更新 flag = updateById(exists_jobInfo); // 返回 return flag; } // ---------------------- tools ---------------------- public Date generateNextValidTime(JobInfoEntity jobInfo, Date fromTime) throws Exception { Date nextValidTime = new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime); return nextValidTime; } /** * 调度任务信息表 新增 * @param jobInfo * @return */ @Override public boolean addJob(JobInfoEntity jobInfo) { boolean flag = false; // add in db jobInfo.setAddTime(new Date()); jobInfo.setUpdateTime(new Date()); jobInfo.setGlueUpdatetime(new Date()); // 新增 flag = save(jobInfo); // 返回 return flag; } /** * 调度任务信息表 启动 * @param jobInfo * @return */ @Override public boolean start(JobInfoEntity jobInfo) { // next trigger time (5s后生效,避开预读周期) long nextTriggerTime = 0; try { Date nextValidTime = generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + PRE_READ_MS)); if (nextValidTime == null) { return false; } nextTriggerTime = nextValidTime.getTime(); } catch (Exception e) { return false; } byte b = 1; jobInfo.setTriggerStatus(b); jobInfo.setTriggerLastTime(0L); jobInfo.setTriggerNextTime(nextTriggerTime); jobInfo.setUpdateTime(new Date()); boolean update = updateById(jobInfo); // 返回 return update; } /** * 调度任务信息表 停止 * @param jobInfo * @return */ @Override public boolean stop(JobInfoEntity jobInfo) { byte b = 0; jobInfo.setTriggerStatus(b); jobInfo.setTriggerLastTime(0L); jobInfo.setTriggerNextTime(0L); jobInfo.setUpdateTime(new Date()); boolean update = updateById(jobInfo); // 返回 return update; } }