From 96e805916ba98054a860c20bc5a7d55403af8a41 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Wed, 18 Jan 2023 14:39:01 +0800 Subject: [PATCH] [ server ] [ scheduler ]- script scheduler - 5 --- .../java/io/wdd/common/utils/TimeUtils.java | 93 ++++++++++++------- .../rpc/controller/SchedulerController.java | 10 +- .../job/AgentScriptSchedulerJob.java | 2 +- .../service/QuartzSchedulerService.java | 8 +- .../service/QuartzSchedulerServiceImpl.java | 78 ++++++++++------ 5 files changed, 125 insertions(+), 66 deletions(-) diff --git a/common/src/main/java/io/wdd/common/utils/TimeUtils.java b/common/src/main/java/io/wdd/common/utils/TimeUtils.java index 135b448..831c5ab 100644 --- a/common/src/main/java/io/wdd/common/utils/TimeUtils.java +++ b/common/src/main/java/io/wdd/common/utils/TimeUtils.java @@ -12,6 +12,9 @@ import java.util.concurrent.TimeUnit; public class TimeUtils { + private static final ZoneId SYSTEM_TIME_ZONE_ID = ZoneId.of("UTC+8"); + + /** * https://memorynotfound.com/calculate-relative-time-time-ago-java/ *

@@ -22,34 +25,55 @@ public class TimeUtils { private static final Map times = new LinkedHashMap<>(); static { - times.put("year", - TimeUnit.DAYS.toMillis(365)); - times.put("month", - TimeUnit.DAYS.toMillis(30)); - times.put("week", - TimeUnit.DAYS.toMillis(7)); - times.put("day", - TimeUnit.DAYS.toMillis(1)); - times.put("hour", - TimeUnit.HOURS.toMillis(1)); - times.put("minute", - TimeUnit.MINUTES.toMillis(1)); - times.put("second", - TimeUnit.SECONDS.toMillis(1)); + times.put( + "year", + TimeUnit.DAYS.toMillis(365) + ); + times.put( + "month", + TimeUnit.DAYS.toMillis(30) + ); + times.put( + "week", + TimeUnit.DAYS.toMillis(7) + ); + times.put( + "day", + TimeUnit.DAYS.toMillis(1) + ); + times.put( + "hour", + TimeUnit.HOURS.toMillis(1) + ); + times.put( + "minute", + TimeUnit.MINUTES.toMillis(1) + ); + times.put( + "second", + TimeUnit.SECONDS.toMillis(1) + ); } public static ByteBuffer currentTimeByteBuffer() { - byte[] timeBytes = LocalDateTime.now(ZoneId.of("UTC+8")) - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) - .getBytes(StandardCharsets.UTF_8); + byte[] timeBytes = LocalDateTime + .now(SYSTEM_TIME_ZONE_ID) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + .getBytes(StandardCharsets.UTF_8); return ByteBuffer.wrap(timeBytes); } public static LocalDateTime currentTime() { - return LocalDateTime.now(ZoneId.of("UTC+8")); + return LocalDateTime.now(SYSTEM_TIME_ZONE_ID); + } + + public static LocalDateTime cvFromDate(Date date) { + + return LocalDateTime.ofInstant(date.toInstant(), + SYSTEM_TIME_ZONE_ID); } /** @@ -57,8 +81,9 @@ public class TimeUtils { */ public static String currentTimeString() { - return LocalDateTime.now(ZoneId.of("UTC+8")) - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return LocalDateTime + .now(SYSTEM_TIME_ZONE_ID) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } /** @@ -66,8 +91,9 @@ public class TimeUtils { */ public static String currentTimeStringFullSplit() { - return LocalDateTime.now(ZoneId.of("UTC+8")) - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")); + return LocalDateTime + .now(SYSTEM_TIME_ZONE_ID) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")); } @@ -82,11 +108,12 @@ public class TimeUtils { for (Map.Entry time : times.entrySet()) { long timeDelta = duration / time.getValue(); if (timeDelta > 0) { - res.append(timeDelta) - .append(" ") - .append(time.getKey()) - .append(timeDelta > 1 ? "s" : "") - .append(", "); + res + .append(timeDelta) + .append(" ") + .append(time.getKey()) + .append(timeDelta > 1 ? "s" : "") + .append(", "); duration -= time.getValue() * timeDelta; level++; } @@ -104,8 +131,10 @@ public class TimeUtils { } public static String toRelative(long duration) { - return toRelative(duration, - times.size()); + return toRelative( + duration, + times.size() + ); } public static String toRelative(Date start, Date end) { @@ -115,7 +144,9 @@ public class TimeUtils { public static String toRelative(Date start, Date end, int level) { assert start.after(end); - return toRelative(end.getTime() - start.getTime(), - level); + return toRelative( + end.getTime() - start.getTime(), + level + ); } } diff --git a/server/src/main/java/io/wdd/rpc/controller/SchedulerController.java b/server/src/main/java/io/wdd/rpc/controller/SchedulerController.java index d4d5533..fb80a0f 100644 --- a/server/src/main/java/io/wdd/rpc/controller/SchedulerController.java +++ b/server/src/main/java/io/wdd/rpc/controller/SchedulerController.java @@ -26,18 +26,18 @@ public class SchedulerController { /** * -------------------------------------------------------------- * 页面定时任务部分 - * 应该只有脚本功能才可以定时,目前一阶段的功能 - * */ + * 应该只有脚本功能才可以定时,目前一阶段的功能 + */ @ApiOperation(value = "新增一个定时脚本任务") @PostMapping(value = "/script/create") - public R createScriptScheduler( + public R> createScriptScheduler( @ApiParam(name = "scheduleScript") @RequestBody() ScriptSchedulerVO scriptSchedulerVO ) { - octopusQuartzService.createScriptScheduledMission(scriptSchedulerVO); + List resultList = octopusQuartzService.createScriptScheduledMission(scriptSchedulerVO); - return R.ok("ok"); + return R.ok(resultList); } diff --git a/server/src/main/java/io/wdd/rpc/scheduler/job/AgentScriptSchedulerJob.java b/server/src/main/java/io/wdd/rpc/scheduler/job/AgentScriptSchedulerJob.java index ab8720e..5c68324 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/job/AgentScriptSchedulerJob.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/job/AgentScriptSchedulerJob.java @@ -25,7 +25,7 @@ public class AgentScriptSchedulerJob extends QuartzJobBean { .getJobDataMap(); // ScriptScheduleDTO - ScriptSchedulerDTO scriptSchedulerDTO = (ScriptSchedulerDTO) jobDataMap.get("scriptSchedulerPO"); + ScriptSchedulerDTO scriptSchedulerDTO = (ScriptSchedulerDTO) jobDataMap.get("scriptSchedulerDTO"); // 调用实际任务执行器 agentApplyScheduledScript.apply(scriptSchedulerDTO); diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerService.java b/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerService.java index 03fe8b0..4eb5b5e 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerService.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerService.java @@ -98,9 +98,11 @@ public interface QuartzSchedulerService { /** * -------------------------------------------------------------- * 页面定时任务部分 - * 应该只有脚本功能才可以定时,目前一阶段的功能 - * */ - void createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO); + * 应该只有脚本功能才可以定时,目前一阶段的功能 + * + * @return + */ + List createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO); } diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java b/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java index e0c9a77..dc6fefd 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/QuartzSchedulerServiceImpl.java @@ -2,6 +2,7 @@ package io.wdd.rpc.scheduler.service; import io.wdd.common.handler.MyRuntimeException; import io.wdd.common.utils.FunctionReader; +import io.wdd.common.utils.TimeUtils; import io.wdd.rpc.scheduler.beans.OctopusQuartzJob; import io.wdd.rpc.scheduler.beans.ScriptSchedulerDTO; import io.wdd.rpc.scheduler.beans.ScriptSchedulerVO; @@ -13,7 +14,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; import org.quartz.*; import org.quartz.DateBuilder.IntervalUnit; import org.quartz.impl.matchers.GroupMatcher; @@ -23,6 +23,7 @@ import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -38,12 +39,10 @@ import static org.quartz.TriggerBuilder.newTrigger; @Service public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { - @Autowired - private Scheduler scheduler; - @Resource ScriptSchedulerService scriptSchedulerService; - + @Autowired + private Scheduler scheduler; /** @@ -52,14 +51,11 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { * 应该只有脚本功能才可以定时,目前一阶段的功能 * */ - - /** - * - * - * */ + * @return + */ @Override - public void createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO) { + public List createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO) { // validate important value ScriptSchedulerDTO scriptSchedulerDTO = validateAndConvertToScriptSchedulerDTO(scriptSchedulerVO); @@ -68,10 +64,13 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { // build the trigger // bind job and trigger HashMap dataMap = new HashMap<>(); - dataMap.put("scriptSchedulerDTO", scriptSchedulerDTO); + dataMap.put( + "scriptSchedulerDTO", + scriptSchedulerDTO + ); this.addMission( AgentScriptSchedulerJob.class, - scriptSchedulerVO.getName(), + scriptSchedulerVO.getSchedulerUuid(), SCHEDULE_MISSION_GROUP_NAME, 1, scriptSchedulerVO.getScriptContent(), @@ -79,32 +78,58 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { ); // persistent the script scheduled mission - // todo dto should store more info + // dto should store more info ScriptSchedulerPO scriptSchedulerPO = convertToScriptSchedulerPO(scriptSchedulerDTO); - scriptSchedulerService.save(scriptSchedulerPO); + log.info(String.valueOf(scriptSchedulerPO)); + +// scriptSchedulerService.save(scriptSchedulerPO); + + return scriptSchedulerDTO.getResultKeyList(); } /** - * 转换 中间层 --> 持久层 + * 转换 中间层 --> 持久层 * * @param dto 定时脚本任务-中间转换状态-实体类 * @return 定时脚本任务-持久化-实体类 */ private ScriptSchedulerPO convertToScriptSchedulerPO(ScriptSchedulerDTO dto) { - // todo should be a static method - - return ScriptSchedulerPO + ScriptSchedulerPO schedulerPO = ScriptSchedulerPO .builder() .cronExpress(dto.getCronExpress()) .schedulerUuid(dto.getSchedulerUuid()) .scriptContent(String.valueOf(dto.getCommandList())) .targetMachine(String.valueOf(dto.getTargetMachineList())) .build(); + + // 获取JobDetail存储上次调度时间和下次执行时间 + try { + Trigger schedulerTrigger = scheduler.getTrigger( + new TriggerKey( + dto.getSchedulerUuid(), + SCHEDULE_MISSION_GROUP_NAME + ) + ); + + + LocalDateTime last_schedule_time = TimeUtils.cvFromDate(schedulerTrigger.getFinalFireTime()); + LocalDateTime next_schedule_time = TimeUtils.cvFromDate(schedulerTrigger.getNextFireTime()); + + schedulerPO.setLastScheduleTime(last_schedule_time); + schedulerPO.setNextScheduleTime(next_schedule_time); + + } catch (SchedulerException e) { + throw new RuntimeException(e); + } + + + return schedulerPO; } /** - * 转换 视图层 --> 中间层 + * 转换 视图层 --> 中间层 + * * @param scriptSchedulerVO 定时脚本任务-前端页面-实体类 * @return 定时脚本任务-中间转换状态-实体类 */ @@ -130,13 +155,16 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { throw new MyRuntimeException("target machine wrong !"); } ArrayList targetMachineList = new ArrayList<>(); - targetMachineList.stream().forEach( - targetMachineList::add - ); + targetMachineList + .stream() + .forEach( + targetMachineList::add + ); // 生成DTO对象 ScriptSchedulerDTO dto = new ScriptSchedulerDTO(); - BeanUtils.copyProperties(dto,scriptSchedulerVO); + BeanUtils.copyProperties(dto, + scriptSchedulerVO); // 设置属性值 dto.setCommandList(null); @@ -555,6 +583,4 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { } - - }