diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/scheduler/SchedulerManager.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/scheduler/SchedulerManager.java index d56682e..6ad377e 100644 --- a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/scheduler/SchedulerManager.java +++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/scheduler/SchedulerManager.java @@ -9,11 +9,11 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU /** * {@link org.quartz.Scheduler} 的管理器,负责创建任务 - * + *

* 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即: * 1. Job 的 {@link JobDetail#getKey()} * 2. Trigger 的 {@link Trigger#getKey()} - * + *

* 另外,jobHandlerName 对应到 Spring Bean 的名字,直接调用 * * @author 芋道源码 @@ -29,12 +29,12 @@ public class SchedulerManager { /** * 添加 Job 到 Quartz 中 * - * @param jobId 任务编号 - * @param jobHandlerName 任务处理器的名字 + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 * @param jobHandlerParam 任务处理器的参数 - * @param cronExpression CRON 表达式 - * @param retryCount 重试次数 - * @param retryInterval 重试间隔 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 * @throws SchedulerException 添加异常 */ public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam, String cronExpression, @@ -55,21 +55,53 @@ public class SchedulerManager { /** * 更新 Job 到 Quartz * - * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerName 任务处理器的名字 * @param jobHandlerParam 任务处理器的参数 - * @param cronExpression CRON 表达式 - * @param retryCount 重试次数 - * @param retryInterval 重试间隔 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 * @throws SchedulerException 更新异常 */ - public void updateJob(String jobHandlerName, String jobHandlerParam, String cronExpression, + public void updateJob(Long jobId, String jobHandlerName, String jobHandlerParam, String cronExpression, Integer retryCount, Integer retryInterval) throws SchedulerException { validateScheduler(); - // 创建新 Trigger 对象 - Trigger newTrigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); - // 修改调度 - scheduler.rescheduleJob(new TriggerKey(jobHandlerName), newTrigger); + JobKey jobKey = JobKey.jobKey(jobHandlerName); + TriggerKey triggerKey = TriggerKey.triggerKey(jobHandlerName); + // 重新构建 Trigger + Trigger newTrigger = this.buildTrigger( + jobHandlerName, + jobHandlerParam, + cronExpression, + retryCount, + retryInterval + ); + // 1. 先判断 Job 是否存在 + if (scheduler.checkExists(jobKey)) { + // 2. 存在则更新 Trigger + if (scheduler.checkExists(triggerKey)) { + scheduler.rescheduleJob(triggerKey, newTrigger); + } else { + // Job 在,但 Trigger 不在时,补一个 Trigger + scheduler.scheduleJob(newTrigger); + } + } else { + addJob(jobId, jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + } + } + + private JobDetail buildJobDetail(String jobHandlerName, String jobHandlerParam, + Integer retryCount, Integer retryInterval) { + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("jobHandlerName", jobHandlerName); + jobDataMap.put("jobHandlerParam", jobHandlerParam); + jobDataMap.put("retryCount", retryCount); + jobDataMap.put("retryInterval", retryInterval); + + return JobBuilder.newJob(JobHandlerInvoker.class) + .withIdentity(jobHandlerName) + .usingJobData(jobDataMap) + .build(); } /** @@ -113,8 +145,8 @@ public class SchedulerManager { /** * 立即触发一次 Quartz 中的 Job * - * @param jobId 任务编号 - * @param jobHandlerName 任务处理器的名字 + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 * @param jobHandlerParam 任务处理器的参数 * @throws SchedulerException 触发异常 */ diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java index 0687d13..9976168 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java @@ -87,7 +87,7 @@ public class JobServiceImpl implements JobService { jobMapper.updateById(updateObj); // 3. 更新 Job 到 Quartz 中 - schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), + schedulerManager.updateJob(job.getId(), job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), updateReqVO.getRetryCount(), updateReqVO.getRetryInterval()); } @@ -190,7 +190,7 @@ public class JobServiceImpl implements JobService { @Override public PageResult getJobPage(JobPageReqVO pageReqVO) { - return jobMapper.selectPage(pageReqVO); + return jobMapper.selectPage(pageReqVO); } private static void fillJobMonitorTimeoutEmpty(JobDO job) { diff --git a/yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImplTest.java b/yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImplTest.java index 204c59e..063e753 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImplTest.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImplTest.java @@ -90,7 +90,7 @@ public class JobServiceImplTest extends BaseDbUnitTest { } @Test - public void testUpdateJob_jobNotExists(){ + public void testUpdateJob_jobNotExists() { // 准备参数 JobSaveReqVO reqVO = randomPojo(JobSaveReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); @@ -99,7 +99,7 @@ public class JobServiceImplTest extends BaseDbUnitTest { } @Test - public void testUpdateJob_onlyNormalStatus(){ + public void testUpdateJob_onlyNormalStatus() { // mock 数据 JobDO job = randomPojo(JobDO.class, o -> o.setStatus(JobStatusEnum.INIT.getStatus())); jobMapper.insert(job); @@ -134,7 +134,7 @@ public class JobServiceImplTest extends BaseDbUnitTest { JobDO updateJob = jobMapper.selectById(updateReqVO.getId()); assertPojoEquals(updateReqVO, updateJob); // 校验调用 - verify(schedulerManager).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), + verify(schedulerManager).updateJob(eq(job.getId()), eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()), eq(updateReqVO.getRetryCount()), eq(updateReqVO.getRetryInterval())); } }