feat: 2.4.0
1. 优化触发时间
This commit is contained in:
		
							parent
							
								
									ff92c582e1
								
							
						
					
					
						commit
						b55fe2413d
					
				| @ -2,6 +2,7 @@ package com.aizuda.easy.retry.server.job.task.support.dispatch; | ||||
| 
 | ||||
| import akka.actor.AbstractActor; | ||||
| import cn.hutool.core.lang.Assert; | ||||
| import com.aizuda.easy.retry.common.core.constant.SystemConstants; | ||||
| import com.aizuda.easy.retry.common.core.enums.JobOperationReasonEnum; | ||||
| import com.aizuda.easy.retry.common.core.enums.JobTaskBatchStatusEnum; | ||||
| import com.aizuda.easy.retry.common.core.enums.StatusEnum; | ||||
| @ -158,6 +159,8 @@ public class JobExecutorActor extends AbstractActor { | ||||
|                 preTriggerAt = job.getNextTriggerAt(); | ||||
|             } | ||||
| 
 | ||||
|             System.out.println("时间监控 " + ResidentTaskCache.get(job.getId()) + "-" + job.getNextTriggerAt()); | ||||
| 
 | ||||
|             WaitStrategies.WaitStrategyContext waitStrategyContext = new WaitStrategies.WaitStrategyContext(); | ||||
|             waitStrategyContext.setTriggerType(job.getTriggerType()); | ||||
|             waitStrategyContext.setTriggerInterval(job.getTriggerInterval()); | ||||
|  | ||||
| @ -97,7 +97,13 @@ public class ScanJobTaskActor extends AbstractActor { | ||||
|             // 更新下次触发时间 | ||||
|            nextTriggerAt = calculateNextTriggerTime(partitionTask); | ||||
|         } else { | ||||
|             triggerTask = false; | ||||
|             // 若常驻任务的缓存时间为空则触发一次任务调度,说明常驻任务长时间未更新或者是系统刚刚启动 | ||||
|             triggerTask = Objects.isNull(nextTriggerAt); | ||||
|             // 若出现常驻任务时间为null或者常驻任务的内存时间长期未更新, 刷新为now | ||||
|             LocalDateTime now = LocalDateTime.now(); | ||||
|             if (Objects.isNull(nextTriggerAt) || nextTriggerAt.plusSeconds(SystemConstants.SCHEDULE_PERIOD).isBefore(now)) { | ||||
|                 nextTriggerAt = now; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         job.setNextTriggerAt(nextTriggerAt); | ||||
| @ -118,8 +124,7 @@ public class ScanJobTaskActor extends AbstractActor { | ||||
|      * 3、常驻任务中的触发时间不是最新的 | ||||
|      */ | ||||
|     private static boolean needCalculateNextTriggerTime(JobPartitionTask partitionTask, LocalDateTime nextTriggerAt) { | ||||
|         return !Objects.equals(StatusEnum.YES.getStatus(), partitionTask.getResident()) | ||||
|                 || Objects.isNull(nextTriggerAt) || partitionTask.getNextTriggerAt().isAfter(nextTriggerAt); | ||||
|         return !Objects.equals(StatusEnum.YES.getStatus(), partitionTask.getResident()); | ||||
|     } | ||||
| 
 | ||||
|     private LocalDateTime calculateNextTriggerTime(JobPartitionTask partitionTask) { | ||||
|  | ||||
| @ -8,6 +8,7 @@ import com.aizuda.easy.retry.common.core.util.CronExpression; | ||||
| import com.aizuda.easy.retry.server.common.config.SystemProperties; | ||||
| import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; | ||||
| import com.aizuda.easy.retry.server.job.task.support.WaitStrategy; | ||||
| import com.aizuda.easy.retry.server.job.task.support.cache.ResidentTaskCache; | ||||
| import com.aizuda.easy.retry.server.job.task.support.strategy.WaitStrategies.WaitStrategyContext; | ||||
| import com.aizuda.easy.retry.server.job.task.support.strategy.WaitStrategies.WaitStrategyEnum; | ||||
| import com.aizuda.easy.retry.server.web.model.base.PageResult; | ||||
| @ -22,6 +23,7 @@ import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper; | ||||
| import com.aizuda.easy.retry.template.datasource.persistence.po.Job; | ||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| @ -35,6 +37,7 @@ import java.util.ArrayList; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| /** | ||||
|  * @author www.byteblogs.com | ||||
| @ -42,6 +45,7 @@ import java.util.Objects; | ||||
|  * @since 2.4.0 | ||||
|  */ | ||||
| @Service | ||||
| @Slf4j | ||||
| public class JobServiceImpl implements JobService { | ||||
| 
 | ||||
|     private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); | ||||
| @ -128,28 +132,56 @@ public class JobServiceImpl implements JobService { | ||||
|         // 判断常驻任务 | ||||
|         Job job = updateJobResident(jobRequestVO); | ||||
|         job.setBucketIndex(HashUtil.bkdrHash(jobRequestVO.getGroupName() + jobRequestVO.getJobName()) % systemProperties.getBucketTotal()); | ||||
|         calculateNextTriggerAt(jobRequestVO, job); | ||||
|         calculateNextTriggerAt(jobRequestVO, LocalDateTime.now()); | ||||
|         return 1 == jobMapper.insert(job); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean updateJob(JobRequestVO jobRequestVO) { | ||||
|         Assert.notNull(jobRequestVO.getId(), () -> new EasyRetryServerException("id 不能为空")); | ||||
|         Assert.isTrue(1 == jobMapper.selectCount(new LambdaQueryWrapper<Job>().eq(Job::getId, jobRequestVO.getId()))); | ||||
| 
 | ||||
|         Job job = jobMapper.selectById(jobRequestVO.getId()); | ||||
|         Assert.notNull(job, () -> new EasyRetryServerException("更新失败")); | ||||
| 
 | ||||
|         LocalDateTime oldTime = job.getNextTriggerAt(); | ||||
|         // 判断常驻任务 | ||||
|         Job job = updateJobResident(jobRequestVO); | ||||
|         calculateNextTriggerAt(jobRequestVO, job); | ||||
|         return 1 == jobMapper.updateById(job); | ||||
|         Job updateJob = updateJobResident(jobRequestVO); | ||||
| 
 | ||||
| //        LocalDateTime waitUpdateTime = null; | ||||
|         // 新老都是常驻任务 | ||||
|         if (Objects.equals(job.getResident(), StatusEnum.YES.getStatus()) && Objects.equals(updateJob.getResident(), StatusEnum.YES.getStatus())) { | ||||
| //            LocalDateTime newTime = calculateNextTriggerAt(jobRequestVO, LocalDateTime.now()); | ||||
|             log.info("新老都是常驻任务 newTime:[{}] oldTime:[{}]", null ,  oldTime); | ||||
| //            job.setNextTriggerAt(oldTime); | ||||
|             // 老的是常驻任务 新的是非常驻任务 需要使用内存里面的触发时间计算触发时间 | ||||
|         } else  if (Objects.equals(job.getResident(), StatusEnum.YES.getStatus()) && Objects.equals(updateJob.getResident(), StatusEnum.NO.getStatus())) { | ||||
|             // 常驻任务的触发时间 | ||||
|             LocalDateTime time = Optional.ofNullable(ResidentTaskCache.get(jobRequestVO.getId())).orElse(LocalDateTime.now()); | ||||
|             LocalDateTime newTime = calculateNextTriggerAt(jobRequestVO, time); | ||||
|             log.info("old是常驻任务 new不常驻任务 newTime:[{}] oldTime:[{}]", newTime ,  oldTime); | ||||
|             updateJob.setNextTriggerAt(newTime); | ||||
|             // 老的是不是常驻任务 新的是常驻任务 需要使用当前时间计算下次触发时间 | ||||
|         }  else  if (Objects.equals(job.getResident(), StatusEnum.NO.getStatus()) && Objects.equals(updateJob.getResident(), StatusEnum.YES.getStatus())) { | ||||
|             LocalDateTime newTime = calculateNextTriggerAt(jobRequestVO, LocalDateTime.now()); | ||||
|             log.info("old不是常驻任务 new是常驻任务 newTime:[{}] oldTime:[{}]",newTime ,  oldTime); | ||||
|             updateJob.setNextTriggerAt(LocalDateTime.now()); | ||||
|         } else { | ||||
| 
 | ||||
|             LocalDateTime newTime = calculateNextTriggerAt(jobRequestVO, LocalDateTime.now()); | ||||
|             log.info("old不是常驻任务 new不常驻任务 newTime:[{}] oldTime:[{}]",newTime ,  oldTime); | ||||
|             updateJob.setNextTriggerAt(newTime); | ||||
|         } | ||||
| 
 | ||||
|         return 1 == jobMapper.updateById(updateJob); | ||||
|     } | ||||
| 
 | ||||
|     private static void calculateNextTriggerAt(final JobRequestVO jobRequestVO, final Job job) { | ||||
|     private static LocalDateTime calculateNextTriggerAt(final JobRequestVO jobRequestVO, LocalDateTime time) { | ||||
|         WaitStrategy waitStrategy = WaitStrategyEnum.getWaitStrategy(jobRequestVO.getTriggerType()); | ||||
|         WaitStrategyContext waitStrategyContext = new WaitStrategyContext(); | ||||
|         waitStrategyContext.setTriggerType(jobRequestVO.getTriggerType()); | ||||
|         waitStrategyContext.setTriggerInterval(jobRequestVO.getTriggerInterval()); | ||||
|         waitStrategyContext.setNextTriggerAt(LocalDateTime.now()); | ||||
|         job.setNextTriggerAt(waitStrategy.computeRetryTime(waitStrategyContext)); | ||||
|         waitStrategyContext.setNextTriggerAt(time); | ||||
|         return waitStrategy.computeRetryTime(waitStrategyContext); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 byteblogs168
						byteblogs168