malei05 3 tuần trước cách đây
mục cha
commit
d195000947

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

@@ -50,17 +50,21 @@ 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());
 				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());
-				taskUtil.resumeJob(sysjob, scheduler);
+				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());
-				taskUtil.pauseJob(sysjob, scheduler);
+				taskUtil.addOrUpdateJob(sysjob, scheduler);
 			}
 			else {
 				log.info("[移除] jobId: {}, jobName: {}, jobGroup: {}, 状态: {}", sysjob.getJobId(), sysjob.getJobName(), sysjob.getJobGroup(), sysjob.getJobStatus());

+ 3 - 3
src/main/java/net/yyc/quartz/controller/SysJobController.java

@@ -103,7 +103,7 @@ public class SysJobController {
 		sysJob.setUpdateBy(SecurityUtils.getUser().getUsername());
 		SysJob querySysJob = this.sysJobService.getById(sysJob.getJobId());
 		if (JOB_STATUS_NOT_RUNNING.getType().equals(querySysJob.getJobStatus())) {
-			this.taskUtil.addOrUpateJob(sysJob, scheduler);
+			this.taskUtil.addOrUpdateJob(sysJob, scheduler);
 			sysJobService.updateById(sysJob);
 		}
 		else if (JOB_STATUS_RELEASE.getType().equals(querySysJob.getJobStatus())) {
@@ -184,7 +184,7 @@ public class SysJobController {
 			}
 			else if (JOB_STATUS_RUNNING.getType().equals(sysjob.getJobStatus())
 					|| JOB_STATUS_NOT_RUNNING.getType().equals(sysjob.getJobStatus())) {
-				taskUtil.addOrUpateJob(sysjob, scheduler);
+				taskUtil.addOrUpdateJob(sysjob, scheduler);
 			}
 			else {
 				taskUtil.removeJob(sysjob, scheduler);
@@ -204,7 +204,7 @@ public class SysJobController {
 		log.info("启动定时任务: {}", jobId);
 		SysJob querySysJob = this.sysJobService.getById(jobId);
 		if (querySysJob != null && JOB_LOG_STATUS_FAIL.getType().equals(querySysJob.getJobStatus())) {
-			taskUtil.addOrUpateJob(querySysJob, scheduler);
+			taskUtil.addOrUpdateJob(querySysJob, scheduler);
 		}
 		else {
 			taskUtil.resumeJob(querySysJob, scheduler);

+ 173 - 204
src/main/java/net/yyc/quartz/util/TaskUtil.java

@@ -17,9 +17,9 @@
 
 package net.yyc.quartz.util;
 
+import lombok.extern.slf4j.Slf4j;
 import net.yyc.quartz.config.QuartzFactory;
 import net.yyc.quartz.entity.SysJob;
-import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
 import org.springframework.stereotype.Component;
 
@@ -34,208 +34,177 @@ import static net.yyc.quartz.constants.QuartzEnum.*;
 @Component
 public class TaskUtil {
 
-	/**
-	 * 获取定时任务的唯一key
-	 * @param sysjob
-	 * @return
-	 */
-	public static JobKey getJobKey(SysJob sysjob) {
-		return JobKey.jobKey(sysjob.getJobName(), sysjob.getJobGroup());
-	}
-
-	/**
-	 * 获取定时任务触发器cron的唯一key
-	 * @param sysjob
-	 * @return
-	 */
-	public static TriggerKey getTriggerKey(SysJob sysjob) {
-		return TriggerKey.triggerKey(sysjob.getJobName(), sysjob.getJobGroup());
-	}
-
-	/**
-	 * 添加或更新定时任务
-	 * @param sysjob
-	 * @param scheduler
-	 */
-	public void addOrUpateJob(SysJob sysjob, Scheduler scheduler) {
-		CronTrigger trigger = null;
-		try {
-			JobKey jobKey = getJobKey(sysjob);
-			// 获得触发器
-			TriggerKey triggerKey = getTriggerKey(sysjob);
-			trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
-			// 判断触发器是否存在(如果存在说明之前运行过但是在当前被禁用了,如果不存在说明一次都没运行过)
-			if (trigger == null) {
-				// 新建一个工作任务 指定任务类型为串接进行的
-				JobDetail jobDetail = JobBuilder.newJob(QuartzFactory.class).withIdentity(jobKey).build();
-				// 将任务信息添加到任务信息中
-				jobDetail.getJobDataMap().put(SCHEDULE_JOB_KEY.getType(), sysjob);
-				// 将cron表达式进行转换
-				CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysjob.getCronExpression());
-				cronScheduleBuilder = this.handleCronScheduleMisfirePolicy(sysjob, cronScheduleBuilder);
-				// 创建触发器并将cron表达式对象给塞入
-				trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder)
-						.build();
-				// 在调度器中将触发器和任务进行组合
-				scheduler.scheduleJob(jobDetail, trigger);
-			}
-			else {
-				CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysjob.getCronExpression());
-				cronScheduleBuilder = this.handleCronScheduleMisfirePolicy(sysjob, cronScheduleBuilder);
-				// 按照新的规则进行
-				trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder)
-						.build();
-				// 将任务信息更新到任务信息中
-				trigger.getJobDataMap().put(SCHEDULE_JOB_KEY.getType(), sysjob);
-				// 重启
-				scheduler.rescheduleJob(triggerKey, trigger);
-			}
-			// 如任务状态为暂停
-			if (sysjob.getJobStatus().equals(JOB_STATUS_NOT_RUNNING.getType())) {
-				this.pauseJob(sysjob, scheduler);
-			}
-		}
-		catch (SchedulerException e) {
-			log.error("添加或更新定时任务,失败信息:{}", e.getMessage());
-		}
-	}
-
-	/**
-	 * 立即执行一次任务
-	 */
-	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;
-	}
-
-	/**
-	 * 暂停定时任务
-	 * @param sysjob
-	 * @param scheduler
-	 */
-	public void pauseJob(SysJob sysjob, Scheduler scheduler) {
-		try {
-			if (scheduler != null) {
-				scheduler.pauseJob(getJobKey(sysjob));
-			}
-		}
-		catch (SchedulerException e) {
-			log.error("暂停任务失败,失败信息:{}", e.getMessage());
-		}
-
-	}
-
-	/**
-	 * 恢复定时任务
-	 * @param sysjob
-	 * @param scheduler
-	 */
-	public void resumeJob(SysJob sysjob, Scheduler scheduler) {
-		try {
-			if (scheduler != null) {
-				scheduler.resumeJob(getJobKey(sysjob));
-			}
-		}
-		catch (SchedulerException e) {
-			log.error("恢复任务失败,失败信息:{}", e.getMessage());
-		}
-
-	}
-
-	/**
-	 * 移除定时任务
-	 * @param sysjob
-	 * @param scheduler
-	 */
-	public void removeJob(SysJob sysjob, Scheduler scheduler) {
-		try {
-			if (scheduler != null) {
-				// 停止触发器
-				scheduler.pauseTrigger(getTriggerKey(sysjob));
-				// 移除触发器
-				scheduler.unscheduleJob(getTriggerKey(sysjob));
-				// 删除任务
-				scheduler.deleteJob(getJobKey(sysjob));
-			}
-		}
-		catch (Exception e) {
-			log.error("移除定时任务失败,失败信息:{}", e.getMessage());
-		}
-	}
-
-	/**
-	 * 启动所有运行定时任务
-	 * @param scheduler
-	 */
-	public void startJobs(Scheduler scheduler) {
-		try {
-			if (scheduler != null) {
-				scheduler.resumeAll();
-			}
-		}
-		catch (SchedulerException e) {
-			log.error("启动所有运行定时任务失败,失败信息:{}", e.getMessage());
-		}
-	}
-
-	/**
-	 * 停止所有运行定时任务
-	 * @param scheduler
-	 */
-	public void pauseJobs(Scheduler scheduler) {
-		try {
-			if (scheduler != null) {
-				scheduler.pauseAll();
-			}
-		}
-		catch (Exception e) {
-			log.error("暂停所有运行定时任务失败,失败信息:{}", e.getMessage());
-		}
-	}
-
-	/**
-	 * 获取错失执行策略方法
-	 * @param sysJob
-	 * @param cronScheduleBuilder
-	 * @return
-	 */
-	private CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob sysJob,
-			CronScheduleBuilder cronScheduleBuilder) {
-		if (MISFIRE_DEFAULT.getType().equals(sysJob.getMisfirePolicy())) {
-			return cronScheduleBuilder;
-		}
-		else if (MISFIRE_IGNORE_MISFIRES.getType().equals(sysJob.getMisfirePolicy())) {
-			return cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
-		}
-		else if (MISFIRE_FIRE_AND_PROCEED.getType().equals(sysJob.getMisfirePolicy())) {
-			return cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
-		}
-		else if (MISFIRE_DO_NOTHING.getType().equals(sysJob.getMisfirePolicy())) {
-			return cronScheduleBuilder.withMisfireHandlingInstructionDoNothing();
-		}
-		else {
-			return cronScheduleBuilder;
-		}
-	}
-
-	/**
-	 * 判断cron表达式是否正确
-	 * @param cronExpression
-	 * @return
-	 */
-	public boolean isValidCron(String cronExpression) {
-		return CronExpression.isValidExpression(cronExpression);
-	}
+    /**
+     * 获取定时任务的唯一key
+     */
+    public static JobKey getJobKey(SysJob sysjob) {
+        return JobKey.jobKey(sysjob.getJobName(), sysjob.getJobGroup());
+    }
+
+    /**
+     * 获取定时任务触发器cron的唯一key
+     */
+    public static TriggerKey getTriggerKey(SysJob sysjob) {
+        return TriggerKey.triggerKey(sysjob.getJobName(), sysjob.getJobGroup());
+    }
+
+    /**
+     * 添加或更新定时任务
+     */
+    public void addOrUpdateJob(SysJob sysjob, Scheduler scheduler) {
+        CronTrigger trigger = null;
+        try {
+            JobKey jobKey = getJobKey(sysjob);
+            // 获得触发器
+            TriggerKey triggerKey = getTriggerKey(sysjob);
+            trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+            // 判断触发器是否存在(如果存在说明之前运行过但是在当前被禁用了,如果不存在说明一次都没运行过)
+            if (trigger == null) {
+                // 新建一个工作任务 指定任务类型为串接进行的
+                JobDetail jobDetail = JobBuilder.newJob(QuartzFactory.class).withIdentity(jobKey).build();
+                // 将任务信息添加到任务信息中
+                jobDetail.getJobDataMap().put(SCHEDULE_JOB_KEY.getType(), sysjob);
+                // 将cron表达式进行转换
+                CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysjob.getCronExpression());
+                cronScheduleBuilder = this.handleCronScheduleMisfirePolicy(sysjob, cronScheduleBuilder);
+                // 创建触发器并将cron表达式对象给塞入
+                trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder)
+                        .build();
+                // 在调度器中将触发器和任务进行组合
+                scheduler.scheduleJob(jobDetail, trigger);
+            } else {
+                CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysjob.getCronExpression());
+                cronScheduleBuilder = this.handleCronScheduleMisfirePolicy(sysjob, cronScheduleBuilder);
+                // 按照新的规则进行
+                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder)
+                        .build();
+                // 将任务信息更新到任务信息中
+                trigger.getJobDataMap().put(SCHEDULE_JOB_KEY.getType(), sysjob);
+                // 重启
+                scheduler.rescheduleJob(triggerKey, trigger);
+            }
+            // 如任务状态为暂停
+            if (sysjob.getJobStatus().equals(JOB_STATUS_NOT_RUNNING.getType())) {
+                this.pauseJob(sysjob, scheduler);
+            }
+        } catch (SchedulerException e) {
+            log.error("添加或更新定时任务,失败信息:{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 立即执行一次任务
+     */
+    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;
+    }
+
+    /**
+     * 暂停定时任务
+     */
+    public void pauseJob(SysJob sysjob, Scheduler scheduler) {
+        try {
+            if (scheduler != null) {
+                scheduler.pauseJob(getJobKey(sysjob));
+            }
+        } catch (SchedulerException e) {
+            log.error("暂停任务失败,失败信息:{}", e.getMessage());
+        }
+
+    }
+
+    /**
+     * 恢复定时任务
+     */
+    public void resumeJob(SysJob sysjob, Scheduler scheduler) {
+        try {
+            if (scheduler != null) {
+                scheduler.resumeJob(getJobKey(sysjob));
+            }
+        } catch (SchedulerException e) {
+            log.error("恢复任务失败,失败信息:{}", e.getMessage());
+        }
+
+    }
+
+    /**
+     * 移除定时任务
+     */
+    public void removeJob(SysJob sysjob, Scheduler scheduler) {
+        try {
+            if (scheduler != null) {
+                // 停止触发器
+                scheduler.pauseTrigger(getTriggerKey(sysjob));
+                // 移除触发器
+                scheduler.unscheduleJob(getTriggerKey(sysjob));
+                // 删除任务
+                scheduler.deleteJob(getJobKey(sysjob));
+            }
+        } catch (Exception e) {
+            log.error("移除定时任务失败,失败信息:{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 启动所有运行定时任务
+     */
+    public void startJobs(Scheduler scheduler) {
+        try {
+            if (scheduler != null) {
+                scheduler.resumeAll();
+            }
+        } catch (SchedulerException e) {
+            log.error("启动所有运行定时任务失败,失败信息:{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 停止所有运行定时任务
+     */
+    public void pauseJobs(Scheduler scheduler) {
+        try {
+            if (scheduler != null) {
+                scheduler.pauseAll();
+            }
+        } catch (Exception e) {
+            log.error("暂停所有运行定时任务失败,失败信息:{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 获取错失执行策略方法
+     */
+    private CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob sysJob,
+                                                                CronScheduleBuilder cronScheduleBuilder) {
+        if (MISFIRE_DEFAULT.getType().equals(sysJob.getMisfirePolicy())) {
+            return cronScheduleBuilder;
+        } else if (MISFIRE_IGNORE_MISFIRES.getType().equals(sysJob.getMisfirePolicy())) {
+            return cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
+        } else if (MISFIRE_FIRE_AND_PROCEED.getType().equals(sysJob.getMisfirePolicy())) {
+            return cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
+        } else if (MISFIRE_DO_NOTHING.getType().equals(sysJob.getMisfirePolicy())) {
+            return cronScheduleBuilder.withMisfireHandlingInstructionDoNothing();
+        } else {
+            return cronScheduleBuilder;
+        }
+    }
+
+    /**
+     * 判断cron表达式是否正确
+     */
+    public boolean isValidCron(String cronExpression) {
+        return CronExpression.isValidExpression(cronExpression);
+    }
 
 }