From 4ee400466cda53a0942ec32afef64a6a37b502d8 Mon Sep 17 00:00:00 2001 From: Hccake Date: Thu, 8 Aug 2019 16:09:06 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0Quartz=E7=AB=8B=E5=88=BB?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=96=B9?= =?UTF-8?q?=E6=B3=95=202.=20=E7=AE=80=E5=8D=95=E6=8A=BD=E5=8F=96TaskInvok?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/2pigxx.sql | 1 + .../quartz/controller/SysJobController.java | 18 ++++++ .../daemon/quartz/util/TaskInvokFactory.java | 46 +++++++++++++++ .../daemon/quartz/util/TaskInvokUtil.java | 57 ++++++------------- .../pigx/daemon/quartz/util/TaskUtil.java | 29 ++++++++-- 5 files changed, 107 insertions(+), 44 deletions(-) create mode 100644 pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokFactory.java diff --git a/db/2pigxx.sql b/db/2pigxx.sql index 141a69fd2..fdbc10b06 100644 --- a/db/2pigxx.sql +++ b/db/2pigxx.sql @@ -408,6 +408,7 @@ INSERT INTO `sys_menu` VALUES (2830, '任务删除', 'job_sys_job_del', NULL, 28 INSERT INTO `sys_menu` VALUES (2840, '任务暂停', 'job_sys_job_shutdown_job', NULL, 2800, '1', 0, '0', '1', '2018-05-15 21:35:18', '2019-03-25 11:50:18', '0'); INSERT INTO `sys_menu` VALUES (2850, '任务开始', 'job_sys_job_start_job', NULL, 2800, '1', 0, '0', '1', '2018-05-15 21:35:18', '2019-03-25 11:50:35', '0'); INSERT INTO `sys_menu` VALUES (2860, '任务刷新', 'job_sys_job_refresh_job', NULL, 2800, '1', 0, '0', '1', '2018-05-15 21:35:18', '2019-03-25 11:50:39', '0'); +INSERT INTO `sys_menu` VALUES (2870, '执行任务', 'job_sys_job_run_job', NULL, 2800, '1', 0, '0', '1', '2019-08-08 15:35:18', '2019-08-08 15:50:35', '0' ); INSERT INTO `sys_menu` VALUES (3000, '系统监控', NULL, '/daemon', -1, 'icon-msnui-supervise', 2, '0', '0', '2018-07-27 01:13:21', '2018-09-28 08:53:24', '0'); INSERT INTO `sys_menu` VALUES (3100, '服务监控', NULL, 'http://127.0.0.1:5001', 3000, 'icon-server', 0, '0', '0', '2018-06-26 10:50:32', '2019-05-01 23:54:05', '0'); INSERT INTO `sys_menu` VALUES (3110, '缓存监控', NULL, '/monitor/redis/index', 3000, 'icon-qingchuhuancun', 1, '1', '0', '2019-05-08 23:51:27', '2019-06-24 15:17:45', '0'); diff --git a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/controller/SysJobController.java b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/controller/SysJobController.java index dceed54a3..9a39c0616 100644 --- a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/controller/SysJobController.java +++ b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/controller/SysJobController.java @@ -230,6 +230,24 @@ public class SysJobController { return R.ok(); } + + /** + * 启动定时任务 + * + * @param jobId + * @return + */ + @SysLog("立刻执行定时任务") + @PostMapping("/run-job/{id}") + @PreAuthorize("@pms.hasPermission('job_sys_job_run_job')") + @ApiOperation(value = "立刻执行定时任务") + public R runJob(@PathVariable("id") Integer jobId) { + SysJob querySysJob = this.sysJobService.getById(jobId); + return TaskUtil.runOnce(scheduler, querySysJob)? R.ok(): R.failed(); + } + + + /** * 暂停定时任务 * diff --git a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokFactory.java b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokFactory.java new file mode 100644 index 000000000..741a47943 --- /dev/null +++ b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokFactory.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.daemon.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.daemon.quartz.constant.enums.JobTypeQuartzEnum; +import com.pig4cloud.pigx.daemon.quartz.exception.TaskException; +import lombok.extern.slf4j.Slf4j; + +/** + * @author Hccake + * @version 1.0 + * @date 2019/8/8 15:40 + * TaskInvok工厂类 + */ +@Slf4j +public class TaskInvokFactory { + + /** + * 根据对应jobType获取对应 invoker + * @param jobType + * @return + * @throws TaskException + */ + public static ITaskInvok getInvoker(String jobType) throws TaskException { + if (StrUtil.isBlank(jobType)) { + log.info("获取TaskInvok传递参数有误,jobType:{}", jobType); + throw new TaskException(""); + } + + ITaskInvok iTaskInvok = null; + if (JobTypeQuartzEnum.JAVA.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("javaClassTaskInvok"); + } else if (JobTypeQuartzEnum.SPRING_BEAN.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("springBeanTaskInvok"); + } else if (JobTypeQuartzEnum.REST.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("restTaskInvok"); + } else if (JobTypeQuartzEnum.JAR.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("jarTaskInvok"); + } else if (StrUtil.isBlank(jobType)) { + log.info("定时任务类型无对应反射方式,反射类型:{}", jobType); + throw new TaskException(""); + } + + return iTaskInvok; + } +} diff --git a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokUtil.java b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokUtil.java index c496824de..af01248fd 100644 --- a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokUtil.java +++ b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskInvokUtil.java @@ -19,18 +19,16 @@ package com.pig4cloud.pigx.daemon.quartz.util; import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.common.core.util.SpringContextHolder; -import com.pig4cloud.pigx.daemon.quartz.constant.enums.JobTypeQuartzEnum; import com.pig4cloud.pigx.daemon.quartz.constant.enums.PigxQuartzEnum; import com.pig4cloud.pigx.daemon.quartz.entity.SysJob; import com.pig4cloud.pigx.daemon.quartz.entity.SysJobLog; import com.pig4cloud.pigx.daemon.quartz.event.SysJobLogEvent; -import com.pig4cloud.pigx.daemon.quartz.exception.TaskException; import com.pig4cloud.pigx.daemon.quartz.service.SysJobService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.annotation.Aspect; +import org.quartz.CronTrigger; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; @@ -55,7 +53,6 @@ public class TaskInvokUtil { @SneakyThrows public void invokMethod(SysJob sysJob, Trigger trigger) { - ITaskInvok iTaskInvok; //执行开始时间 long startTime; //执行结束时间 @@ -79,54 +76,34 @@ public class TaskInvokUtil { sysJobLog.setCronExpression(sysJob.getCronExpression()); sysJobLog.setTenantId(sysJob.getTenantId()); try { - if (StrUtil.isEmpty(sysJob.getJobType())) { - log.info("定时任务类型无对应反射方式,反射类型为空"); - throw new TaskException("定时任务类型无对应反射方式,反射类型为空"); - } - if (StrUtil.isNotEmpty(sysJob.getJobType()) && JobTypeQuartzEnum.JAVA.getType() - .equals(sysJob.getJobType())) { - iTaskInvok = SpringContextHolder.getBean("javaClassTaskInvok"); - iTaskInvok.invokMethod(sysJob); - } else if (StrUtil.isNotEmpty(sysJob.getJobType()) && JobTypeQuartzEnum.SPRING_BEAN.getType() - .equals(sysJob.getJobType())) { - iTaskInvok = SpringContextHolder.getBean("springBeanTaskInvok"); - iTaskInvok.invokMethod(sysJob); - } else if (StrUtil.isNotEmpty(sysJob.getJobType()) && JobTypeQuartzEnum.REST.getType() - .equals(sysJob.getJobType())) { - iTaskInvok = SpringContextHolder.getBean("restTaskInvok"); - iTaskInvok.invokMethod(sysJob); - } else if (StrUtil.isNotEmpty(sysJob.getJobType()) && JobTypeQuartzEnum.JAR.getType() - .equals(sysJob.getJobType())) { - iTaskInvok = SpringContextHolder.getBean("jarTaskInvok"); - iTaskInvok.invokMethod(sysJob); - } else { - log.info("定时任务类型无对应反射方式,反射类型:{}", sysJob.getJobType()); - throw new TaskException(""); - } - //获取执行结束时间 - endTime = System.currentTimeMillis(); + //执行任务 + ITaskInvok iTaskInvok = TaskInvokFactory.getInvoker(sysJob.getJobType()); + iTaskInvok.invokMethod(sysJob); + + //记录成功状态 sysJobLog.setJobMessage(PigxQuartzEnum.JOB_LOG_STATUS_SUCCESS.getDescription()); sysJobLog.setJobLogStatus(PigxQuartzEnum.JOB_LOG_STATUS_SUCCESS.getType()); - sysJobLog.setExecuteTime(String.valueOf(endTime - startTime)); //任务表信息更新 updateSysjob.setJobExecuteStatus(PigxQuartzEnum.JOB_LOG_STATUS_SUCCESS.getType()); - updateSysjob.setStartTime(trigger.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); - updateSysjob.setPreviousTime(trigger.getPreviousFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); - updateSysjob.setNextTime(trigger.getNextFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); } catch (Throwable e) { - //获取执行结束时间 - endTime = System.currentTimeMillis(); log.error("定时任务执行失败,任务名称:{};任务组名:{},cron执行表达式:{},执行时间:{}", sysJob.getJobName(), sysJob.getJobGroup(), sysJob.getCronExpression(), new Date()); + //记录失败状态 sysJobLog.setJobMessage(PigxQuartzEnum.JOB_LOG_STATUS_FAIL.getDescription()); sysJobLog.setJobLogStatus(PigxQuartzEnum.JOB_LOG_STATUS_FAIL.getType()); - sysJobLog.setExecuteTime(String.valueOf(endTime - startTime)); sysJobLog.setExceptionInfo(StrUtil.sub(e.getMessage(), 0, 2000)); //任务表信息更新 updateSysjob.setJobExecuteStatus(PigxQuartzEnum.JOB_LOG_STATUS_FAIL.getType()); - updateSysjob.setStartTime(trigger.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); - updateSysjob.setPreviousTime(trigger.getPreviousFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); - updateSysjob.setNextTime(trigger.getNextFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); } finally { + //记录执行时间 立刻执行使用的是simpleTeigger + if(trigger instanceof CronTrigger){ + updateSysjob.setStartTime(trigger.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + updateSysjob.setPreviousTime(trigger.getPreviousFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + updateSysjob.setNextTime(trigger.getNextFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + } + //记录执行时长 + endTime = System.currentTimeMillis(); + sysJobLog.setExecuteTime(String.valueOf(endTime - startTime)); + publisher.publishEvent(new SysJobLogEvent(sysJobLog)); sysJobService.updateById(updateSysjob); } diff --git a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskUtil.java b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskUtil.java index 1046282e6..6b65eb664 100644 --- a/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskUtil.java +++ b/pigx-visual/pigx-daemon-quartz/src/main/java/com/pig4cloud/pigx/daemon/quartz/util/TaskUtil.java @@ -40,7 +40,7 @@ public class TaskUtil { * @param sysjob * @return */ - public JobKey getJobKey(SysJob sysjob) { + public static JobKey getJobKey(SysJob sysjob) { return JobKey.jobKey(sysjob.getJobName(), sysjob.getJobGroup()); } @@ -50,7 +50,7 @@ public class TaskUtil { * @param sysjob * @return */ - public TriggerKey getTriggerKey(SysJob sysjob) { + public static TriggerKey getTriggerKey(SysJob sysjob) { return TriggerKey.triggerKey(sysjob.getJobName(), sysjob.getJobGroup()); } @@ -63,9 +63,9 @@ public class TaskUtil { public void addOrUpateJob(SysJob sysjob, Scheduler scheduler) { CronTrigger trigger = null; try { - JobKey jobKey = this.getJobKey(sysjob); + JobKey jobKey = getJobKey(sysjob); //获得触发器 - TriggerKey triggerKey = this.getTriggerKey(sysjob); + TriggerKey triggerKey = getTriggerKey(sysjob); trigger = (CronTrigger) scheduler.getTrigger(triggerKey); //判断触发器是否存在(如果存在说明之前运行过但是在当前被禁用了,如果不存在说明一次都没运行过) if (trigger == null) { @@ -99,6 +99,27 @@ public class TaskUtil { } } + + /** + * 立即执行一次任务 + */ + public static boolean runOnce(Scheduler scheduler, SysJob sysJob) { + try { + //参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(SCHEDULE_JOB_KEY.getType(), sysJob); + + scheduler.triggerJob(getJobKey(sysJob), dataMap); + } catch (SchedulerException e) { + log.error("立刻执行定时任务,失败信息:{}", e.getMessage()); + return false; + } + + return true; + } + + + /** * 暂停定时任务 *