This commit is contained in:
冷冷 committed 2019-08-08 20:09:32 +08:00
commit b998215e11
5 files changed
+107 -44

No files matched your search

+1
View File
@@ -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');
@@ -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();
}
/**
* 暂停定时任务
*
@@ -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;
}
}
@@ -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);
}
@@ -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;
}
/**
* 暂停定时任务
*