malei05 3 veckor sedan
förälder
incheckning
54be67500f

+ 6 - 4
src/main/java/net/yyc/quartz/config/QuartzFactory.java

@@ -17,6 +17,7 @@
 
 package net.yyc.quartz.config;
 
+import cn.hutool.core.util.IdUtil;
 import net.yyc.quartz.constants.QuartzEnum;
 import net.yyc.quartz.entity.SysJob;
 import lombok.SneakyThrows;
@@ -24,7 +25,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.quartz.DisallowConcurrentExecution;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
-import org.springframework.beans.factory.annotation.Autowired;
 
 import javax.annotation.Resource;
 
@@ -46,9 +46,11 @@ public class QuartzFactory implements Job {
 	public void execute(JobExecutionContext jobExecutionContext) {
 		SysJob sysJob = (SysJob) jobExecutionContext.getMergedJobDataMap()
 				.get(QuartzEnum.SCHEDULE_JOB_KEY.getType());
-		log.info("定时任务被调度, jobId: {}, jobName: {}, jobGroup: {}, className: {}, methodName: {}",
-				sysJob.getJobId(), sysJob.getJobName(), sysJob.getJobGroup(), sysJob.getClassName(), sysJob.getMethodName());
-		quartzInvokeFactory.init(sysJob, jobExecutionContext.getTrigger());
+		String executionId = IdUtil.fastSimpleUUID();
+		log.info("[QUARTZ] [{}] 任务开始 | jobId={} jobName={} jobGroup={} class={} method={}",
+				executionId, sysJob.getJobId(), sysJob.getJobName(), sysJob.getJobGroup(),
+				sysJob.getClassName(), sysJob.getMethodName());
+		quartzInvokeFactory.init(sysJob, jobExecutionContext.getTrigger(), executionId);
 	}
 
 }

+ 4 - 8
src/main/java/net/yyc/quartz/config/QuartzInitJob.java

@@ -50,24 +50,20 @@ public class QuartzInitJob {
 		List<SysJob> jobList = sysJobService.list();
 		log.info("========== 开始加载定时任务,共 {} 条 ==========", jobList.size());
 		jobList.forEach(sysjob -> {
-			log.info("[检查] jobId: {}, jobName: {}, jobStatus: '{}', statusType: '{}', match: {}",
-					sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobStatus(),
-					QuartzEnum.JOB_STATUS_RUNNING.getType(),
-					QuartzEnum.JOB_STATUS_RUNNING.getType().equals(sysjob.getJobStatus()));
 			if (QuartzEnum.JOB_STATUS_RELEASE.getType().equals(sysjob.getJobStatus())) {
-				log.info("[移除] jobId: {}, jobName: {}, jobGroup: {}, 状态: 已发布", sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobGroup());
+				log.info("[QUARTZ] [INIT] 移除 | jobId={} jobName={} 状态=已发布", sysjob.getJobId(), sysjob.getJobName());
 				taskUtil.removeJob(sysjob, scheduler);
 			}
 			else if (QuartzEnum.JOB_STATUS_RUNNING.getType().equals(sysjob.getJobStatus())) {
-				log.info("[调度] jobId: {}, jobName: {}, jobGroup: {}, 状态: 运行中", sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobGroup());
+				log.info("[QUARTZ] [INIT] 调度 | jobId={} jobName={}", sysjob.getJobId(), sysjob.getJobName());
 				taskUtil.addOrUpdateJob(sysjob, scheduler);
 			}
 			else if (QuartzEnum.JOB_STATUS_NOT_RUNNING.getType().equals(sysjob.getJobStatus())) {
-				log.info("[暂停] jobId: {}, jobName: {}, jobGroup: {}, 状态: 暂停", sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobGroup());
+				log.info("[QUARTZ] [INIT] 暂停 | jobId={} jobName={}", sysjob.getJobId(), sysjob.getJobName());
 				taskUtil.addOrUpdateJob(sysjob, scheduler);
 			}
 			else {
-				log.info("[移除] jobId: {}, jobName: {}, jobGroup: {}, 状态: {}", sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobGroup(), sysjob.getJobStatus());
+				log.info("[QUARTZ] [INIT] 移除 | jobId={} jobName={} 状态={}", sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobStatus());
 				taskUtil.removeJob(sysjob, scheduler);
 			}
 		});

+ 2 - 2
src/main/java/net/yyc/quartz/config/QuartzInvokeFactory.java

@@ -37,8 +37,8 @@ public class QuartzInvokeFactory {
 	private final ApplicationEventPublisher publisher;
 
 	@SneakyThrows
-	void init(SysJob sysJob, Trigger trigger) {
-		publisher.publishEvent(new SysJobEvent(sysJob, trigger));
+	void init(SysJob sysJob, Trigger trigger, String executionId) {
+		publisher.publishEvent(new SysJobEvent(sysJob, trigger, executionId));
 	}
 
 }

+ 2 - 0
src/main/java/net/yyc/quartz/event/SysJobEvent.java

@@ -33,4 +33,6 @@ public class SysJobEvent {
 
 	private final Trigger trigger;
 
+	private final String executionId;
+
 }

+ 2 - 1
src/main/java/net/yyc/quartz/event/SysJobListener.java

@@ -41,7 +41,8 @@ public class SysJobListener {
 	public void comSysJob(SysJobEvent event) {
 		SysJob sysJob = event.getSysJob();
 		Trigger trigger = event.getTrigger();
-		taskInvokeUtil.invokeMethod(sysJob, trigger);
+		String executionId = event.getExecutionId();
+		taskInvokeUtil.invokeMethod(sysJob, trigger, executionId);
 	}
 
 }

+ 39 - 44
src/main/java/net/yyc/quartz/util/SpringBeanTaskInvoke.java

@@ -18,11 +18,11 @@
 package net.yyc.quartz.util;
 
 import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
 import net.yyc.common.core.util.SpringContextHolder;
 import net.yyc.quartz.constants.QuartzEnum;
 import net.yyc.quartz.entity.SysJob;
 import net.yyc.quartz.exception.TaskException;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ReflectionUtils;
 
@@ -38,48 +38,43 @@ import java.lang.reflect.Method;
 @Slf4j
 public class SpringBeanTaskInvoke implements ITaskInvok {
 
-	@Override
-	public void invokMethod(SysJob sysJob) throws TaskException {
-		Object target;
-		Method method;
-		Object returnValue;
-		// 通过Spring上下文去找 也有可能找不到
-		target = SpringContextHolder.getBean(sysJob.getClassName());
-		try {
-			if (StrUtil.isNotEmpty(sysJob.getMethodParamsValue())) {
-				method = target.getClass().getDeclaredMethod(sysJob.getMethodName(), String.class);
-				ReflectionUtils.makeAccessible(method);
-				int jobId = sysJob.getJobId();
-				String params = sysJob.getMethodParamsValue();
-				if (jobId ==  27 || jobId == 28 || jobId == 29 || jobId == 30){
-					params = params+ "," +sysJob.getUuid();
-				}
-				returnValue = method.invoke(target, params);
-			}
-			else {
-				method = target.getClass().getDeclaredMethod(sysJob.getMethodName());
-				ReflectionUtils.makeAccessible(method);
-				returnValue = method.invoke(target);
-			}
-			if (StrUtil.isEmpty(returnValue.toString())
-					|| QuartzEnum.JOB_LOG_STATUS_FAIL.getType().equals(returnValue.toString())) {
-				log.error("定时任务springBeanTaskInvok异常,执行任务:{}", sysJob.getClassName());
-				throw new TaskException("定时任务springBeanTaskInvok业务执行失败,任务:" + sysJob.getClassName());
-			}
-		}
-		catch (NoSuchMethodException e) {
-			log.error("定时任务spring bean反射异常方法未找到,执行任务:{}", sysJob.getClassName());
-			throw new TaskException("定时任务spring bean反射异常方法未找到,执行任务:" + sysJob.getClassName());
-		}
-		catch (IllegalAccessException e) {
-			log.error("定时任务spring bean反射异常,执行任务:{}", sysJob.getClassName());
-			throw new TaskException("定时任务spring bean反射异常,执行任务:" + sysJob.getClassName());
-		}
-		catch (InvocationTargetException e) {
-			log.error("定时任务spring bean反射执行异常,执行任务:{}", sysJob.getClassName());
-			e.printStackTrace();
-			throw new TaskException("定时任务spring bean反射执行异常,执行任务:" + sysJob.getClassName());
-		}
-	}
+    @Override
+    public void invokMethod(SysJob sysJob) throws TaskException {
+        Object target;
+        Method method;
+        Object returnValue;
+        // 通过Spring上下文去找 也有可能找不到
+        target = SpringContextHolder.getBean(sysJob.getClassName());
+        try {
+            if (StrUtil.isNotEmpty(sysJob.getMethodParamsValue())) {
+                method = target.getClass().getDeclaredMethod(sysJob.getMethodName(), String.class);
+                ReflectionUtils.makeAccessible(method);
+                int jobId = sysJob.getJobId();
+                String params = sysJob.getMethodParamsValue();
+                if (jobId == 27 || jobId == 28 || jobId == 29 || jobId == 30) {
+                    params = params + "," + sysJob.getUuid();
+                }
+                returnValue = method.invoke(target, params);
+            } else {
+                method = target.getClass().getDeclaredMethod(sysJob.getMethodName());
+                ReflectionUtils.makeAccessible(method);
+                returnValue = method.invoke(target);
+            }
+            if (StrUtil.isEmpty(returnValue.toString())
+                    || QuartzEnum.JOB_LOG_STATUS_FAIL.getType().equals(returnValue.toString())) {
+                log.error("定时任务springBeanTaskInvok异常,执行任务:{}", sysJob.getClassName());
+                throw new TaskException("定时任务springBeanTaskInvok业务执行失败,任务:" + sysJob.getClassName());
+            }
+        } catch (NoSuchMethodException e) {
+            log.error("[QUARTZ] Bean方法未找到 | bean={} method={} 请检查方法名和参数是否匹配", sysJob.getClassName(), sysJob.getMethodName());
+            throw new TaskException("Bean方法未找到, bean=" + sysJob.getClassName() + ", method=" + sysJob.getMethodName());
+        } catch (IllegalAccessException e) {
+            log.error("[QUARTZ] Bean方法无法访问 | bean={} method={}", sysJob.getClassName(), sysJob.getMethodName());
+            throw new TaskException("Bean方法无法访问, bean=" + sysJob.getClassName() + ", method=" + sysJob.getMethodName());
+        } catch (InvocationTargetException e) {
+            log.error("[QUARTZ] Bean方法执行异常 | bean={} method={} error={}", sysJob.getClassName(), sysJob.getMethodName(), e.getTargetException().getMessage(), e.getTargetException());
+            throw new TaskException("Bean方法执行异常, bean=" + sysJob.getClassName() + ", method=" + sysJob.getMethodName());
+        }
+    }
 
 }

+ 10 - 9
src/main/java/net/yyc/quartz/util/TaskInvokeUtil.java

@@ -17,7 +17,6 @@
 
 package net.yyc.quartz.util;
 
-import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import net.yyc.quartz.constants.QuartzEnum;
 import net.yyc.quartz.entity.SysJob;
@@ -34,7 +33,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 
 import java.time.ZoneId;
-import java.util.Date;
 
 /**
  * 定时任务反射工具类
@@ -52,7 +50,7 @@ public class TaskInvokeUtil {
 	private SysJobService sysJobService;
 
 	@SneakyThrows
-	public void invokeMethod(SysJob sysJob, Trigger trigger) {
+	public void invokeMethod(SysJob sysJob, Trigger trigger, String executionId) {
 
 		// 执行开始时间
 		long startTime;
@@ -60,14 +58,12 @@ public class TaskInvokeUtil {
 		long endTime;
 		// 获取执行开始时间
 		startTime = System.currentTimeMillis();
-		// 日志uuid
-		String uuid = IdUtil.fastSimpleUUID();
 		// 更新定时任务表内的状态、执行时间、上次执行时间、下次执行时间等信息
 		SysJob updateSysjob = new SysJob();
 		updateSysjob.setJobId(sysJob.getJobId());
 		// 日志
 		SysJobLog sysJobLog = new SysJobLog();
-		sysJobLog.setUuid(uuid);
+		sysJobLog.setUuid(executionId);
 		sysJobLog.setJobId(sysJob.getJobId());
 		sysJobLog.setJobName(sysJob.getJobName());
 		sysJobLog.setJobGroup(sysJob.getJobGroup());
@@ -83,7 +79,7 @@ public class TaskInvokeUtil {
 			// 执行任务
 			ITaskInvok iTaskInvok = TaskInvokFactory.getInvoker(sysJob.getJobType());
 			// 设置uuid
-			sysJob.setUuid(uuid);
+			sysJob.setUuid(executionId);
 			// 直接执行任务
 			iTaskInvok.invokMethod(sysJob);
 
@@ -94,8 +90,8 @@ public class TaskInvokeUtil {
 			updateSysjob.setJobExecuteStatus(QuartzEnum.JOB_LOG_STATUS_SUCCESS.getType());
 		}
 		catch (Throwable e) {
-			log.error("定时任务执行失败,任务名称:{};任务组名:{},cron执行表达式:{},执行时间:{}", sysJob.getJobName(), sysJob.getJobGroup(),
-					sysJob.getCronExpression(), new Date());
+			log.error("[QUARTZ] [{}] 任务失败 | jobId={} jobName={} error={}",
+					executionId, sysJob.getJobId(), sysJob.getJobName(), e.getMessage(), e);
 			// 记录失败状态
 			sysJobLog.setJobMessage(QuartzEnum.JOB_LOG_STATUS_FAIL.getDescription());
 			sysJobLog.setJobLogStatus(QuartzEnum.JOB_LOG_STATUS_FAIL.getType());
@@ -117,6 +113,11 @@ public class TaskInvokeUtil {
 			endTime = System.currentTimeMillis();
 			sysJobLog.setExecuteTime(String.valueOf(endTime - startTime));
 
+			if (QuartzEnum.JOB_LOG_STATUS_SUCCESS.getType().equals(sysJobLog.getJobLogStatus())) {
+				log.info("[QUARTZ] [{}] 任务完成 | jobId={} jobName={} 耗时={}ms",
+						executionId, sysJob.getJobId(), sysJob.getJobName(), endTime - startTime);
+			}
+
 			publisher.publishEvent(new SysJobLogEvent(sysJobLog));
 			sysJobService.updateById(updateSysjob);
 		}