mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-17 19:51:53 +08:00
优化 job 调度:
1. 新增或修改 job 配置时,校验 handlerName 对应的 Spring Bean 存在 2. 删除 job 时,额外暂停 Trigger、取消调度,更完善
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
package cn.iocoder.yudao.module.infra.service.job;
|
||||
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||
import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager;
|
||||
import cn.iocoder.yudao.framework.quartz.core.util.CronUtils;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO;
|
||||
@@ -9,13 +11,12 @@ import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobSaveReqVO;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO;
|
||||
import cn.iocoder.yudao.module.infra.dal.mysql.job.JobMapper;
|
||||
import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.quartz.SchedulerException;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.containsAny;
|
||||
import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*;
|
||||
@@ -39,24 +40,25 @@ public class JobServiceImpl implements JobService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createJob(JobSaveReqVO createReqVO) throws SchedulerException {
|
||||
validateCronExpression(createReqVO.getCronExpression());
|
||||
// 校验唯一性
|
||||
// 1.1 校验唯一性
|
||||
if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) {
|
||||
throw exception(JOB_HANDLER_EXISTS);
|
||||
}
|
||||
// 插入
|
||||
// 1.2 校验 JobHandler 是否存在
|
||||
validateJobHandlerExists(createReqVO.getHandlerName());
|
||||
|
||||
// 2. 插入 JobDO
|
||||
JobDO job = BeanUtils.toBean(createReqVO, JobDO.class);
|
||||
job.setStatus(JobStatusEnum.INIT.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
|
||||
// 添加 Job 到 Quartz 中
|
||||
// 3.1 添加 Job 到 Quartz 中
|
||||
schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(),
|
||||
createReqVO.getRetryCount(), createReqVO.getRetryInterval());
|
||||
// 更新
|
||||
// 3.2 更新 JobDO
|
||||
JobDO updateObj = JobDO.builder().id(job.getId()).status(JobStatusEnum.NORMAL.getStatus()).build();
|
||||
jobMapper.updateById(updateObj);
|
||||
|
||||
// 返回
|
||||
return job.getId();
|
||||
}
|
||||
|
||||
@@ -64,22 +66,35 @@ public class JobServiceImpl implements JobService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateJob(JobSaveReqVO updateReqVO) throws SchedulerException {
|
||||
validateCronExpression(updateReqVO.getCronExpression());
|
||||
// 校验存在
|
||||
// 1.1 校验存在
|
||||
JobDO job = validateJobExists(updateReqVO.getId());
|
||||
// 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行
|
||||
// 1.2 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行
|
||||
if (!job.getStatus().equals(JobStatusEnum.NORMAL.getStatus())) {
|
||||
throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS);
|
||||
}
|
||||
// 更新
|
||||
// 1.3 校验 JobHandler 是否存在
|
||||
validateJobHandlerExists(updateReqVO.getHandlerName());
|
||||
|
||||
// 2. 更新 JobDO
|
||||
JobDO updateObj = BeanUtils.toBean(updateReqVO, JobDO.class);
|
||||
fillJobMonitorTimeoutEmpty(updateObj);
|
||||
jobMapper.updateById(updateObj);
|
||||
|
||||
// 更新 Job 到 Quartz 中
|
||||
// 3. 更新 Job 到 Quartz 中
|
||||
schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(),
|
||||
updateReqVO.getRetryCount(), updateReqVO.getRetryInterval());
|
||||
}
|
||||
|
||||
private void validateJobHandlerExists(String handlerName) {
|
||||
Object handler = SpringUtil.getBean(handlerName);
|
||||
if (handler == null) {
|
||||
throw exception(JOB_HANDLER_BEAN_NOT_EXISTS);
|
||||
}
|
||||
if (!(handler instanceof JobHandler)) {
|
||||
throw exception(JOB_HANDLER_BEAN_TYPE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateJobStatus(Long id, Integer status) throws SchedulerException {
|
||||
|
Reference in New Issue
Block a user