diff --git a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobOperationReasonEnum.java b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobOperationReasonEnum.java index fd55639b3..35cbd05b7 100644 --- a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobOperationReasonEnum.java +++ b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobOperationReasonEnum.java @@ -23,6 +23,7 @@ public enum JobOperationReasonEnum { JOB_OVERLAY(5, "任务被覆盖"), NOT_EXECUTE_TASK(6, "无可执行任务项"), TASK_EXECUTE_ERROR(7, "任务执行期间发生非预期异常"), + MANNER_STOP(8, "手动停止"), ; private final int reason; diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobBatchController.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobBatchController.java index d782dc49c..0d1af690e 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobBatchController.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobBatchController.java @@ -3,15 +3,10 @@ package com.aizuda.easy.retry.server.web.controller; import com.aizuda.easy.retry.server.web.annotation.LoginRequired; import com.aizuda.easy.retry.server.web.model.base.PageResult; import com.aizuda.easy.retry.server.web.model.request.JobBatchQueryVO; -import com.aizuda.easy.retry.server.web.model.request.JobQueryVO; import com.aizuda.easy.retry.server.web.model.response.JobBatchResponseVO; -import com.aizuda.easy.retry.server.web.model.response.JobResponseVO; import com.aizuda.easy.retry.server.web.service.JobBatchService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -39,5 +34,10 @@ public class JobBatchController { return jobBatchService.getJobBatchDetail(id); } + @PostMapping("/stop/{taskBatchId}") + @LoginRequired + public Boolean stop(@PathVariable("taskBatchId") Long taskBatchId) { + return jobBatchService.stop(taskBatchId); + } } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java index fb82baa4a..d9b060b25 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java @@ -77,4 +77,10 @@ public class JobController { ) { return jobService.getJobNameList(keywords, jobId); } + + @PostMapping("/trigger/{jobId}") + @LoginRequired + public Boolean trigger(@PathVariable("jobId") Long jobId) { + return jobService.trigger(jobId); + } } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobBatchService.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobBatchService.java index 72871140a..8e49f1281 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobBatchService.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobBatchService.java @@ -16,4 +16,7 @@ public interface JobBatchService { PageResult> getJobBatchPage(JobBatchQueryVO jobQueryVO); JobBatchResponseVO getJobBatchDetail(Long id); + + boolean stop(Long taskBatchId); + } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java index fe28a63ab..2c87fbf6f 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java @@ -32,4 +32,7 @@ public interface JobService { List getTimeByCron(String cron); List getJobNameList(String keywords, Long jobId); + + boolean trigger(Long jobId); + } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java index 9f2ece897..df73af78b 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java @@ -1,7 +1,17 @@ package com.aizuda.easy.retry.server.web.service.impl; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; +import com.aizuda.easy.retry.common.core.enums.JobOperationReasonEnum; import com.aizuda.easy.retry.common.core.enums.StatusEnum; +import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; +import com.aizuda.easy.retry.server.common.util.DateUtils; +import com.aizuda.easy.retry.server.job.task.dto.JobTaskPrepareDTO; +import com.aizuda.easy.retry.server.job.task.support.JobPrePareHandler; +import com.aizuda.easy.retry.server.job.task.support.JobTaskConverter; +import com.aizuda.easy.retry.server.job.task.support.JobTaskStopHandler; +import com.aizuda.easy.retry.server.job.task.support.stop.JobTaskStopFactory; +import com.aizuda.easy.retry.server.job.task.support.stop.TaskStopJobContext; import com.aizuda.easy.retry.server.web.model.base.PageResult; import com.aizuda.easy.retry.server.web.model.request.JobBatchQueryVO; import com.aizuda.easy.retry.server.web.model.response.JobBatchResponseVO; @@ -16,6 +26,7 @@ import com.aizuda.easy.retry.template.datasource.persistence.po.JobTaskBatch; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; @@ -47,10 +58,10 @@ public class JobBatchServiceImpl implements JobBatchService { jobBatchQueryDO.setJobId(queryVO.getJobId()); jobBatchQueryDO.setTaskBatchStatus(queryVO.getTaskBatchStatus()); jobBatchQueryDO.setGroupName(queryVO.getGroupName()); - List batchResponseDOList = jobTaskBatchMapper.selectJobBatchList(pageDTO, jobBatchQueryDO); + List batchResponseDOList = jobTaskBatchMapper.selectJobBatchList(pageDTO, jobBatchQueryDO); List batchResponseVOList = JobBatchResponseVOConverter.INSTANCE.toJobBatchResponseVOs( - batchResponseDOList); + batchResponseDOList); return new PageResult<>(pageDTO, batchResponseVOList); } @@ -65,4 +76,29 @@ public class JobBatchServiceImpl implements JobBatchService { Job job = jobMapper.selectById(jobTaskBatch.getJobId()); return JobBatchResponseVOConverter.INSTANCE.toJobBatchResponseVO(jobTaskBatch, job); } + + @Override + public boolean stop(Long taskBatchId) { + JobTaskBatch jobTaskBatch = jobTaskBatchMapper.selectById(taskBatchId); + Assert.notNull(jobTaskBatch, () -> new EasyRetryServerException("job batch can not be null.")); + + Job job = jobMapper.selectById(jobTaskBatch.getJobId()); + Assert.notNull(job, () -> new EasyRetryServerException("job can not be null.")); + + JobTaskStopHandler jobTaskStop = JobTaskStopFactory.getJobTaskStop(job.getTaskType()); + + TaskStopJobContext taskStopJobContext = new TaskStopJobContext(); + taskStopJobContext.setJobId(job.getId()); + taskStopJobContext.setTaskType(job.getTaskType()); + taskStopJobContext.setGroupName(job.getGroupName()); + taskStopJobContext.setJobOperationReason(JobOperationReasonEnum.MANNER_STOP.getReason()); + taskStopJobContext.setTaskBatchId(jobTaskBatch.getId()); + taskStopJobContext.setForceStop(Boolean.TRUE); + taskStopJobContext.setNeedUpdateTaskStatus(Boolean.TRUE); + + jobTaskStop.stop(taskStopJobContext); + + return Boolean.TRUE; + } + } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java index afb444ea6..251ff72ed 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java @@ -10,6 +10,9 @@ import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; import com.aizuda.easy.retry.server.common.strategy.WaitStrategies; import com.aizuda.easy.retry.server.common.util.CronUtils; import com.aizuda.easy.retry.server.common.util.DateUtils; +import com.aizuda.easy.retry.server.job.task.dto.JobTaskPrepareDTO; +import com.aizuda.easy.retry.server.job.task.support.JobPrePareHandler; +import com.aizuda.easy.retry.server.job.task.support.JobTaskConverter; import com.aizuda.easy.retry.server.job.task.support.cache.ResidentTaskCache; import com.aizuda.easy.retry.server.web.model.base.PageResult; import com.aizuda.easy.retry.server.web.model.request.JobQueryVO; @@ -25,6 +28,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -42,11 +46,13 @@ import java.util.Optional; @Slf4j public class JobServiceImpl implements JobService { - private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Autowired private SystemProperties systemProperties; @Autowired private JobMapper jobMapper; + @Autowired + @Qualifier("terminalJobPrepareHandler") + private JobPrePareHandler jobPrePareHandler; @Override public PageResult> getJobPage(JobQueryVO queryVO) { @@ -190,4 +196,19 @@ public class JobServiceImpl implements JobService { job.setDeleted(StatusEnum.YES.getStatus()); return 1 == jobMapper.updateById(job); } + + @Override + public boolean trigger(Long jobId) { + + Job job = jobMapper.selectById(jobId); + Assert.notNull(job, () -> new EasyRetryServerException("job can not be null.")); + + JobTaskPrepareDTO jobTaskPrepare = JobTaskConverter.INSTANCE.toJobTaskPrepare(job); + // 设置now表示立即执行 + jobTaskPrepare.setNextTriggerAt(DateUtils.toNowMilli()); + // 创建批次 + jobPrePareHandler.handler(jobTaskPrepare); + + return Boolean.TRUE; + } } diff --git a/frontend/src/api/jobApi.js b/frontend/src/api/jobApi.js index 820a74b55..71f7c78f9 100644 --- a/frontend/src/api/jobApi.js +++ b/frontend/src/api/jobApi.js @@ -9,10 +9,12 @@ const jobApi = { delJob: '/job/', timeByCron: '/job/cron', jobNameList: '/job/job-name/list', + triggerJob: '/job/trigger/', // 任务批次 jobBatchList: '/job/batch/list', jobBatchDetail: '/job/batch/', + stop: '/job/batch/stop/', // 任务 jobTaskList: '/job/task/list', @@ -23,6 +25,20 @@ const jobApi = { export default jobApi +export function triggerJob (id) { + return request({ + url: jobApi.triggerJob + id, + method: 'post' + }) +} + +export function stop (id) { + return request({ + url: jobApi.stop + id, + method: 'post' + }) +} + export function jobNameList (parameter) { return request({ url: jobApi.jobNameList, diff --git a/frontend/src/utils/jobEnum.js b/frontend/src/utils/jobEnum.js index d9f17d683..30bd6e4ea 100644 --- a/frontend/src/utils/jobEnum.js +++ b/frontend/src/utils/jobEnum.js @@ -128,6 +128,10 @@ const enums = { '7': { 'name': '任务执行期间发生非预期异常', 'color': '#bdc223' + }, + '8': { + 'name': '手动停止', + 'color': '#23c28a' } }, taskStatus: { diff --git a/frontend/src/views/job/JobBatchList.vue b/frontend/src/views/job/JobBatchList.vue index 735ed32f1..33cca185e 100644 --- a/frontend/src/views/job/JobBatchList.vue +++ b/frontend/src/views/job/JobBatchList.vue @@ -111,6 +111,14 @@