From 07d7810087ae56c1118604c530af31e513956f2c Mon Sep 17 00:00:00 2001 From: zeaslity Date: Wed, 18 Jan 2023 17:57:09 +0800 Subject: [PATCH] [ server ] [ scheduler ]- script scheduler accomplish - 1 --- .../java/io/wdd/common/utils/TimeUtils.java | 5 + .../rpc/controller/SchedulerController.java | 7 +- .../config/QuartzSchedulerUtils.java | 92 +++++++++++++++++++ .../rpc/scheduler/service/PrintHelloJob.java | 16 ---- .../service/QuartzSchedulerService.java | 4 +- .../service/QuartzSchedulerServiceImpl.java | 82 ++--------------- .../script/AgentApplyScheduledScript.java | 18 +++- 7 files changed, 129 insertions(+), 95 deletions(-) create mode 100644 server/src/main/java/io/wdd/rpc/scheduler/config/QuartzSchedulerUtils.java delete mode 100644 server/src/main/java/io/wdd/rpc/scheduler/service/PrintHelloJob.java 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 831c5ab..962948e 100644 --- a/common/src/main/java/io/wdd/common/utils/TimeUtils.java +++ b/common/src/main/java/io/wdd/common/utils/TimeUtils.java @@ -72,6 +72,11 @@ public class TimeUtils { public static LocalDateTime cvFromDate(Date date) { + // fix bug + if (null == date) { + return null; + } + return LocalDateTime.ofInstant(date.toInstant(), SYSTEM_TIME_ZONE_ID); } 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 a1aec58..d98523e 100644 --- a/server/src/main/java/io/wdd/rpc/controller/SchedulerController.java +++ b/server/src/main/java/io/wdd/rpc/controller/SchedulerController.java @@ -11,6 +11,7 @@ import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -33,15 +34,15 @@ public class SchedulerController { @ApiOperation(value = "新增一个定时脚本任务") @PostMapping(value = "/script/create") - public R> createScriptScheduler( + public R> createScriptScheduler( @ApiParam(name = "scheduleScript") @RequestBody() ScriptSchedulerVO scriptSchedulerVO ) { ALL_AGENT_TOPIC_NAME_SET.add("Chengdu-amd64-98-98066f"); - List resultList = octopusQuartzService.createScriptScheduledMission(scriptSchedulerVO); + HashMap map = octopusQuartzService.createScriptScheduledMission(scriptSchedulerVO); - return R.ok(resultList); + return R.ok(map); } diff --git a/server/src/main/java/io/wdd/rpc/scheduler/config/QuartzSchedulerUtils.java b/server/src/main/java/io/wdd/rpc/scheduler/config/QuartzSchedulerUtils.java new file mode 100644 index 0000000..51680b4 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/scheduler/config/QuartzSchedulerUtils.java @@ -0,0 +1,92 @@ +package io.wdd.rpc.scheduler.config; + +import io.wdd.common.beans.executor.ExecutionMessage; +import io.wdd.common.utils.TimeUtils; +import io.wdd.rpc.scheduler.beans.ScriptSchedulerDTO; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.TriggerKey; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; + +import static io.wdd.rpc.scheduler.beans.ScriptSchedulerVO.SCHEDULE_MISSION_GROUP_NAME; + +@Component +public class QuartzSchedulerUtils { + + @Resource + private Scheduler scheduler; + + /** + * @param scriptSchedulerDTO dto + * @return dto中存储的 未来ExecutionKey对象 + */ + public HashMap getFutureExecutionResultKey(ScriptSchedulerDTO scriptSchedulerDTO) { + + ArrayList time = getLastNextExecutionTime( + scriptSchedulerDTO.getSchedulerUuid(), + SCHEDULE_MISSION_GROUP_NAME + ); + + LocalDateTime nextExecutionTime = time.get(1); + + HashMap keyMap = scriptSchedulerDTO.getAgentTopicNameToFutureResultKeyMap(); + + // 为每一个目标Agent都要设置相应的 FutureKey + scriptSchedulerDTO + .getTargetMachineList() + .stream() + .forEach( + targetMachine -> { + keyMap.put( + targetMachine, + ExecutionMessage.GetFutureResultKey( + targetMachine, + nextExecutionTime + ) + ); + } + ); + + return keyMap; + } + + /** + * 定时任务通常在将来执行,所以需要手动获取到下次的执行时间 + * + * @param missionName 任务名称 + * @param missionGroupName 任务Group组名 + * @return 上次调度时间 下次执行时间 + */ + private ArrayList getLastNextExecutionTime(String missionName, String missionGroupName) { + // 获取JobDetail存储上次调度时间和下次执行时间 + try { + Trigger schedulerTrigger = scheduler.getTrigger( + new TriggerKey( + missionName, + missionGroupName + ) + ); + + ArrayList result = new ArrayList<>(); + + LocalDateTime last_schedule_time = TimeUtils.cvFromDate(schedulerTrigger.getFinalFireTime()); + LocalDateTime next_schedule_time = TimeUtils.cvFromDate(schedulerTrigger.getNextFireTime()); + + result.add(last_schedule_time); + result.add(next_schedule_time); + + return result; + + } catch (SchedulerException e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/PrintHelloJob.java b/server/src/main/java/io/wdd/rpc/scheduler/service/PrintHelloJob.java deleted file mode 100644 index 1e8e54a..0000000 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/PrintHelloJob.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.wdd.rpc.scheduler.service; - -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - -public class PrintHelloJob implements Job { - - @Override - public void execute(JobExecutionContext context) throws JobExecutionException { - System.out.println(); - System.out.println("PrintHelloJob被执行了!"); - System.out.println("context = " + context); - System.out.println(); - } -} 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 4eb5b5e..cbdb60c 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 @@ -4,6 +4,8 @@ import io.wdd.rpc.scheduler.beans.OctopusQuartzJob; import io.wdd.rpc.scheduler.beans.ScriptSchedulerVO; import org.quartz.Trigger; import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -102,7 +104,7 @@ public interface QuartzSchedulerService { * * @return */ - List createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO); + HashMap 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 19d14c7..d8e076c 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 @@ -1,12 +1,11 @@ package io.wdd.rpc.scheduler.service; -import io.wdd.common.beans.executor.ExecutionMessage; 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; +import io.wdd.rpc.scheduler.config.QuartzSchedulerUtils; import io.wdd.rpc.scheduler.job.AgentScriptSchedulerJob; import io.wdd.server.beans.po.ScriptSchedulerPO; import io.wdd.server.service.ScriptSchedulerService; @@ -24,7 +23,6 @@ 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; @@ -42,10 +40,13 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { @Resource ScriptSchedulerService scriptSchedulerService; + + @Resource + QuartzSchedulerUtils quartzSchedulerUtils; + @Autowired private Scheduler scheduler; - /** * -------------------------------------------------------------- * 页面定时任务部分 @@ -56,7 +57,7 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { * @return */ @Override - public List createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO) { + public HashMap createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO) { // validate important value ScriptSchedulerDTO scriptSchedulerDTO = validateAndConvertToScriptSchedulerDTO(scriptSchedulerVO); @@ -79,7 +80,7 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { dataMap ); - HashMap futureExecutionResultKey = getFutureExecutionResultKey(scriptSchedulerDTO); + HashMap futureExecutionResultKey = quartzSchedulerUtils.getFutureExecutionResultKey(scriptSchedulerDTO); log.info("futureExecutionResultKey is => {}", futureExecutionResultKey); @@ -90,74 +91,7 @@ public class QuartzSchedulerServiceImpl implements QuartzSchedulerService { // scriptSchedulerService.save(scriptSchedulerPO); - return scriptSchedulerDTO.getResultKeyList(); - } - - - /** - * @param scriptSchedulerDTO dto - * @return dto中存储的 未来ExecutionKey对象 - */ - private HashMap getFutureExecutionResultKey(ScriptSchedulerDTO scriptSchedulerDTO) { - - ArrayList time = getLastNextExecutionTime( - scriptSchedulerDTO.getSchedulerUuid(), - SCHEDULE_MISSION_GROUP_NAME - ); - - LocalDateTime nextExecutionTime = time.get(1); - - HashMap keyMap = scriptSchedulerDTO.getAgentTopicNameToFutureResultKeyMap(); - - // 为每一个目标Agent都要设置相应的 FutureKey - scriptSchedulerDTO - .getTargetMachineList() - .stream() - .forEach( - targetMachine -> { - keyMap.put( - targetMachine, - ExecutionMessage.GetFutureResultKey( - targetMachine, - nextExecutionTime - ) - ); - } - ); - - return keyMap; - } - - /** - * 定时任务通常在将来执行,所以需要手动获取到下次的执行时间 - * - * @param missionName 任务名称 - * @param missionGroupName 任务Group组名 - * @return 上次调度时间 下次执行时间 - */ - public ArrayList getLastNextExecutionTime(String missionName, String missionGroupName) { - // 获取JobDetail存储上次调度时间和下次执行时间 - try { - Trigger schedulerTrigger = scheduler.getTrigger( - new TriggerKey( - missionName, - missionGroupName - ) - ); - - ArrayList result = new ArrayList<>(); - - LocalDateTime last_schedule_time = TimeUtils.cvFromDate(schedulerTrigger.getFinalFireTime()); - LocalDateTime next_schedule_time = TimeUtils.cvFromDate(schedulerTrigger.getNextFireTime()); - - result.add(last_schedule_time); - result.add(next_schedule_time); - - return result; - - } catch (SchedulerException e) { - throw new RuntimeException(e); - } + return futureExecutionResultKey; } /** diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/script/AgentApplyScheduledScript.java b/server/src/main/java/io/wdd/rpc/scheduler/service/script/AgentApplyScheduledScript.java index 0985f5f..b6c04d3 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/script/AgentApplyScheduledScript.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/script/AgentApplyScheduledScript.java @@ -3,10 +3,12 @@ package io.wdd.rpc.scheduler.service.script; import io.wdd.rpc.execute.service.CoreExecutionService; import io.wdd.rpc.scheduler.beans.ScriptSchedulerDTO; +import io.wdd.rpc.scheduler.config.QuartzSchedulerUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; /** @@ -19,20 +21,34 @@ public class AgentApplyScheduledScript { @Resource CoreExecutionService coreExecutionService; + @Resource + QuartzSchedulerUtils quartzSchedulerUtils; + public void apply(ScriptSchedulerDTO scriptSchedulerDTO) { List> completeCommandList = scriptSchedulerDTO.getCompleteCommandList(); List targetMachineList = scriptSchedulerDTO.getTargetMachineList(); + HashMap futureResultKeyMap = scriptSchedulerDTO.getAgentTopicNameToFutureResultKeyMap(); + List resultKeyList = coreExecutionService.SendCommandToAgentComplete( targetMachineList, "Scheduled Script", - completeCommandList + completeCommandList, + futureResultKeyMap ); // 将 resultKeyList 放入这个DTO中 scriptSchedulerDTO.setResultKeyList(resultKeyList); + // 更新DTO中的下次执行时间 否则会出错 + HashMap futureExecutionResultKey = quartzSchedulerUtils.getFutureExecutionResultKey(scriptSchedulerDTO); + + log.info( + "futureExecutionResultKey in scheduled work is => {}", + futureExecutionResultKey + ); + // 需要更新数据库 // 关联性数据库