From 6b0b2a89165cb27a41e506b7f5e3b80458c8ab29 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 11 May 2026 17:09:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/scheduler/SchedulerManager.java | 68 ++++++++++++++----- .../infra/service/job/JobServiceImpl.java | 4 +- .../infra/service/job/JobServiceImplTest.java | 6 +- 3 files changed, 55 insertions(+), 23 deletions(-) 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