linwe
2024-08-09 8b7258c9427882bb1798f1502eaa35184c6e374e
src/main/java/org/springblade/xxljob/service/impl/JobInfoServiceImpl.java
@@ -1,12 +1,16 @@
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.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.Date;
/**
 * 调度任务信息表 服务实现类
@@ -15,12 +19,131 @@
 * @since 2024-01-10
 */
@Service
public class JobInfoServiceImpl extends BaseServiceImpl<JobInfoMapper, JobInfoEntity> implements IJobInfoService {
public class JobInfoServiceImpl extends ServiceImpl<JobInfoMapper, JobInfoEntity> implements IJobInfoService {
   public static final long PRE_READ_MS = 5000;    // pre read
   @Override
   public IPage<JobInfoVO> selectJobInfoPage(IPage<JobInfoVO> 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;
   }
}