增加服务器管理认证方式,增加测试连接接口

This commit is contained in:
dengqichen 2025-10-30 17:07:31 +08:00
parent 10bfa7bcbd
commit bd7733d7d7
4 changed files with 160 additions and 104 deletions

View File

@ -89,6 +89,18 @@ public class ScheduleJobApiController extends BaseController<ScheduleJob, Schedu
return Response.success(); return Response.success();
} }
/**
* 恢复启用禁用任务
*/
@Operation(summary = "启用定时任务", description = "恢复被禁用DISABLED的定时任务重新注册调度状态变为ENABLED")
@PostMapping("/{id}/enable")
public Response<Void> enableJob(
@Parameter(description = "任务ID", required = true) @PathVariable Long id
) {
scheduleJobService.enableJob(id);
return Response.success();
}
/** /**
* 立即触发任务 * 立即触发任务
*/ */

View File

@ -81,7 +81,7 @@ public class ScheduleJob extends Entity<Long> {
*/ */
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false, length = 20) @Column(name = "status", nullable = false, length = 20)
private ScheduleJobStatusEnum status = ScheduleJobStatusEnum.ENABLED; private ScheduleJobStatusEnum status;
/** /**
* 是否允许并发执行 * 是否允许并发执行

View File

@ -41,6 +41,12 @@ public interface IScheduleJobService extends IBaseService<ScheduleJob, ScheduleJ
*/ */
void disableJob(Long jobId); void disableJob(Long jobId);
/**
* 恢复启用解除禁用任务
* @param jobId 任务ID
*/
void enableJob(Long jobId);
/** /**
* 立即执行一次任务仅限ENABLED和PAUSED状态 * 立即执行一次任务仅限ENABLED和PAUSED状态
* *

View File

@ -80,7 +80,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
public ScheduleJobDTO create(ScheduleJobDTO dto) { public ScheduleJobDTO create(ScheduleJobDTO dto) {
// 检查任务名称唯一性 // 检查任务名称唯一性
if (jobRepository.existsByJobNameAndDeletedFalse(dto.getJobName())) { if (jobRepository.existsByJobNameAndDeletedFalse(dto.getJobName())) {
throw new BusinessException(ResponseCode.DATA_ALREADY_EXISTS, new Object[]{"任务名称", dto.getJobName()}); throw new BusinessException(ResponseCode.DATA_ALREADY_EXISTS, new Object[] {"任务名称", dto.getJobName()});
} }
return super.create(dto); return super.create(dto);
} }
@ -95,7 +95,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
// 2. 检查是否试图修改 status强制拦截 // 2. 检查是否试图修改 status强制拦截
if (dto.getStatus() != null && dto.getStatus() != oldStatus) { if (dto.getStatus() != null && dto.getStatus() != oldStatus) {
throw new BusinessException(ResponseCode.SCHEDULE_JOB_STATUS_CANNOT_UPDATE, throw new BusinessException(ResponseCode.SCHEDULE_JOB_STATUS_CANNOT_UPDATE,
new Object[]{"请使用 /start、/pause、/resume、/disable 接口管理任务状态"}); new Object[] {"请使用 /start、/pause、/resume、/disable 接口管理任务状态"});
} }
// 3. 强制保持原状态防止前端传入 // 3. 强制保持原状态防止前端传入
@ -179,6 +179,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
} }
@Override @Override
@Transactional
public void startJob(Long jobId) { public void startJob(Long jobId) {
try { try {
ScheduleJob job = findEntityById(jobId); ScheduleJob job = findEntityById(jobId);
@ -218,6 +219,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
} }
@Override @Override
@Transactional
public void pauseJob(Long jobId) { public void pauseJob(Long jobId) {
try { try {
scheduler.pauseJob(getJobKey(jobId)); scheduler.pauseJob(getJobKey(jobId));
@ -236,6 +238,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
} }
@Override @Override
@Transactional
public void resumeJob(Long jobId) { public void resumeJob(Long jobId) {
try { try {
scheduler.resumeJob(getJobKey(jobId)); scheduler.resumeJob(getJobKey(jobId));
@ -254,6 +257,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
} }
@Override @Override
@Transactional
public void disableJob(Long jobId) { public void disableJob(Long jobId) {
ScheduleJob job = findEntityById(jobId); ScheduleJob job = findEntityById(jobId);
@ -283,6 +287,40 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJob, Schedul
} }
} }
@Override
@Transactional
public void enableJob(Long jobId) {
ScheduleJob job = findEntityById(jobId);
if (job.getStatus() != ScheduleJobStatusEnum.DISABLED) {
throw new BusinessException(ResponseCode.SCHEDULE_JOB_STATUS_CANNOT_UPDATE, new Object[] {"仅禁用状态任务可启用"});
}
try {
// 创建并调度新Job
JobDetail jobDetail = JobBuilder.newJob(DynamicJob.class)
.withIdentity(getJobKey(jobId))
.withDescription(job.getJobDescription())
.build();
jobDetail.getJobDataMap().put("jobId", job.getId());
jobDetail.getJobDataMap().put("jobName", job.getJobName());
jobDetail.getJobDataMap().put("beanName", job.getBeanName());
jobDetail.getJobDataMap().put("methodName", job.getMethodName());
jobDetail.getJobDataMap().put("methodParams", job.getMethodParams());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(getTriggerKey(jobId))
.withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression()))
.build();
scheduler.scheduleJob(jobDetail, trigger);
job.setStatus(ScheduleJobStatusEnum.ENABLED);
jobRepository.save(job);
log.info("任务从DISABLED恢复启用成功jobId={}, jobName={}", jobId, job.getJobName());
} catch (SchedulerException e) {
log.error("恢复启用任务失败jobId={}, jobName={}", jobId, job.getJobName(), e);
throw new BusinessException(ResponseCode.SCHEDULE_JOB_START_FAILED);
}
}
@Override @Override
public void triggerJob(Long jobId) { public void triggerJob(Long jobId) {
// 检查任务状态 // 检查任务状态