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

@@ -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;
}
/**
* 暂停定时任务
*