feat:定时任务

This commit is contained in:
dzc committed 2026-05-11 17:09:53 +08:00
1 parent be6a2960a0
commit 6b0b2a8916
3 files changed
+55 -23

No files matched your search

@@ -9,11 +9,11 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
/**
* {@link org.quartz.Scheduler} 的管理器,负责创建任务
*
* <p>
* 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即:
* 1. Job 的 {@link JobDetail#getKey()}
* 2. Trigger 的 {@link Trigger#getKey()}
*
* <p>
* 另外,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 触发异常
*/
@@ -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<JobDO> getJobPage(JobPageReqVO pageReqVO) {
return jobMapper.selectPage(pageReqVO);
return jobMapper.selectPage(pageReqVO);
}
private static void fillJobMonitorTimeoutEmpty(JobDO job) {
@@ -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()));
}
}