feat:定时任务
This commit is contained in:
1 parent
be6a2960a0
commit
6b0b2a8916
3 files changed
+55
-23
No files matched your search
+50
-18
@@ -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 触发异常
|
||||
*/
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+3
-3
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user