diff --git a/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/client/JobEndPoint.java b/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/client/JobEndPoint.java index 31c91e38..7c379604 100644 --- a/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/client/JobEndPoint.java +++ b/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/client/JobEndPoint.java @@ -89,6 +89,8 @@ public class JobEndPoint { jobContext.setArgsStr(dispatchJob.getArgsStr()); jobContext.setWorkflowNodeId(dispatchJob.getWorkflowNodeId()); jobContext.setWorkflowTaskBatchId(dispatchJob.getWorkflowTaskBatchId()); + jobContext.setRetry(dispatchJob.isRetry()); + jobContext.setRetryScene(dispatchJob.getRetryScene()); return jobContext; } diff --git a/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/executor/JobExecutorFutureCallback.java b/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/executor/JobExecutorFutureCallback.java index 54d1da33..12bdd461 100644 --- a/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/executor/JobExecutorFutureCallback.java +++ b/easy-retry-client/easy-retry-client-job-core/src/main/java/com/aizuda/easy/retry/client/job/core/executor/JobExecutorFutureCallback.java @@ -116,6 +116,8 @@ public class JobExecutorFutureCallback implements FutureCallback dispatchJobRequest.setTaskType(jobContext.getTaskType()); dispatchJobRequest.setExecuteResult(executeResult); dispatchJobRequest.setTaskStatus(status); + dispatchJobRequest.setRetry(jobContext.isRetry()); + dispatchJobRequest.setRetryScene(jobContext.getRetryScene()); return dispatchJobRequest; } } diff --git a/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobRequest.java b/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobRequest.java index ed50ffdd..4dc189a5 100644 --- a/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobRequest.java +++ b/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobRequest.java @@ -53,4 +53,14 @@ public class DispatchJobRequest { private Integer retryCount; + /** + * 重试场景 auto、manual + */ + private Integer retryScene; + + /** + * 是否是重试流量 + */ + private boolean isRetry; + } diff --git a/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobResultRequest.java b/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobResultRequest.java index 5b7dfc52..58c74b5a 100644 --- a/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobResultRequest.java +++ b/easy-retry-common/easy-retry-common-client-api/src/main/java/com/aizuda/easy/retry/client/model/request/DispatchJobResultRequest.java @@ -31,4 +31,14 @@ public class DispatchJobResultRequest { private ExecuteResult executeResult; + /** + * 重试场景 auto、manual + */ + private Integer retryScene; + + /** + * 是否是重试流量 + */ + private boolean isRetry; + } diff --git a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/model/JobContext.java b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/model/JobContext.java index 48f5d73e..2177e0c8 100644 --- a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/model/JobContext.java +++ b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/model/JobContext.java @@ -36,4 +36,14 @@ public class JobContext { private Integer executorTimeout; private String argsStr; + + /** + * 重试场景 auto、manual + */ + private Integer retryScene; + + /** + * 是否是重试流量 + */ + private boolean isRetry; } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/dto/RealJobExecutorDTO.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/dto/RealJobExecutorDTO.java index 27c14049..9349a5dc 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/dto/RealJobExecutorDTO.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/dto/RealJobExecutorDTO.java @@ -77,4 +77,14 @@ public class RealJobExecutorDTO extends BaseDTO { private Long workflowNodeId; + /** + * 重试场景 auto、manual + */ + private Integer retryScene; + + /** + * 是否是重试流量 + */ + private boolean isRetry; + } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/enums/JobRetrySceneEnum.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/enums/JobRetrySceneEnum.java new file mode 100644 index 00000000..feeeb020 --- /dev/null +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/enums/JobRetrySceneEnum.java @@ -0,0 +1,19 @@ +package com.aizuda.easy.retry.server.job.task.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author: xiaowoniu + * @date : 2024-02-27 + * @since : 3.1.0 + */ +@AllArgsConstructor +@Getter +public enum JobRetrySceneEnum { + + AUTO(1), + MANUAL(2); + + private final Integer retryScene; +} diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/AbstractClientCallbackHandler.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/AbstractClientCallbackHandler.java index 9f3069a7..eaf4e4b4 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/AbstractClientCallbackHandler.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/AbstractClientCallbackHandler.java @@ -8,6 +8,7 @@ import com.aizuda.easy.retry.server.common.akka.ActorGenerator; import com.aizuda.easy.retry.server.common.util.ClientInfoUtils; import com.aizuda.easy.retry.server.job.task.dto.LogMetaDTO; import com.aizuda.easy.retry.server.job.task.dto.RealJobExecutorDTO; +import com.aizuda.easy.retry.server.job.task.enums.JobRetrySceneEnum; import com.aizuda.easy.retry.server.job.task.support.ClientCallbackHandler; import com.aizuda.easy.retry.server.job.task.support.JobTaskConverter; import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper; @@ -50,6 +51,8 @@ public abstract class AbstractClientCallbackHandler implements ClientCallbackHan realJobExecutor.setWorkflowNodeId(context.getWorkflowNodeId()); realJobExecutor.setWorkflowTaskBatchId(context.getWorkflowTaskBatchId()); realJobExecutor.setRetryCount(jobTask.getRetryCount() + 1); + realJobExecutor.setRetry(Boolean.TRUE); + realJobExecutor.setRetryScene(context.getRetryScene()); ActorRef actorRef = ActorGenerator.jobRealTaskExecutorActor(); actorRef.tell(realJobExecutor, actorRef); return; @@ -80,6 +83,13 @@ public abstract class AbstractClientCallbackHandler implements ClientCallbackHan private boolean isNeedRetry(ClientCallbackContext context) { + // 手动重试策略 + if (Objects.nonNull(context.getRetryScene()) + && Objects.equals(JobRetrySceneEnum.MANUAL.getRetryScene(), context.getRetryScene()) + && !context.isRetry()) { + return Boolean.TRUE; + } + if (context.getTaskStatus().equals(JobTaskStatusEnum.FAIL.getStatus())) { JobTask jobTask = jobTaskMapper.selectById(context.getTaskId()); @@ -92,6 +102,7 @@ public abstract class AbstractClientCallbackHandler implements ClientCallbackHan context.setClientInfo(jobTask.getClientInfo()); context.setJob(job); context.setJobTask(jobTask); + context.setRetryScene(JobRetrySceneEnum.AUTO.getRetryScene()); return Boolean.TRUE; } } @@ -99,9 +110,7 @@ public abstract class AbstractClientCallbackHandler implements ClientCallbackHan return Boolean.FALSE; } - protected String chooseNewClient(ClientCallbackContext context) { - return null; - } + protected abstract String chooseNewClient(ClientCallbackContext context); protected abstract void doCallback(ClientCallbackContext context); diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClientCallbackContext.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClientCallbackContext.java index c36ff163..fd723972 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClientCallbackContext.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClientCallbackContext.java @@ -1,6 +1,7 @@ package com.aizuda.easy.retry.server.job.task.support.callback; import com.aizuda.easy.retry.client.model.ExecuteResult; +import com.aizuda.easy.retry.server.job.task.enums.JobRetrySceneEnum; import com.aizuda.easy.retry.template.datasource.persistence.po.Job; import com.aizuda.easy.retry.template.datasource.persistence.po.JobTask; import lombok.Data; @@ -43,5 +44,7 @@ public class ClientCallbackContext { private JobTask jobTask; + private Integer retryScene; + private boolean isRetry; } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClusterClientCallbackHandler.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClusterClientCallbackHandler.java index 06887d04..10f0cd2c 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClusterClientCallbackHandler.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/callback/ClusterClientCallbackHandler.java @@ -19,6 +19,7 @@ import com.aizuda.easy.retry.template.datasource.persistence.po.Job; import com.aizuda.easy.retry.template.datasource.persistence.po.JobTask; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -33,14 +34,9 @@ import java.util.Set; */ @Component @Slf4j +@RequiredArgsConstructor public class ClusterClientCallbackHandler extends AbstractClientCallbackHandler { - - @Autowired - private ClientNodeAllocateHandler clientNodeAllocateHandler; - @Autowired - private JobTaskMapper jobTaskMapper; - @Autowired - private JobMapper jobMapper; + private final ClientNodeAllocateHandler clientNodeAllocateHandler; @Override public JobTaskTypeEnum getTaskInstanceType() { diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/handler/JobHandler.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/handler/JobHandler.java index 0b4d4f76..83574a77 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/handler/JobHandler.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/handler/JobHandler.java @@ -10,6 +10,7 @@ import com.aizuda.easy.retry.server.common.akka.ActorGenerator; import com.aizuda.easy.retry.server.common.enums.JobTaskExecutorSceneEnum; import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; import com.aizuda.easy.retry.server.job.task.dto.TaskExecuteDTO; +import com.aizuda.easy.retry.server.job.task.enums.JobRetrySceneEnum; import com.aizuda.easy.retry.server.job.task.support.ClientCallbackHandler; import com.aizuda.easy.retry.server.job.task.support.JobTaskConverter; import com.aizuda.easy.retry.server.job.task.support.JobTaskStopHandler; @@ -97,6 +98,7 @@ public class JobHandler { context.setWorkflowTaskBatchId(workflowTaskBatchId); context.setTaskId(jobTask.getId()); context.setTaskStatus(JobTaskStatusEnum.FAIL.getStatus()); + context.setRetryScene(JobRetrySceneEnum.MANUAL.getRetryScene()); context.setExecuteResult(ExecuteResult.failure(null, "手动重试")); clientCallback.callback(context); } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowNodeServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowNodeServiceImpl.java index 4ee4b507..104f3de0 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowNodeServiceImpl.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowNodeServiceImpl.java @@ -1,31 +1,15 @@ package com.aizuda.easy.retry.server.web.service.impl; import cn.hutool.core.lang.Assert; -import com.aizuda.easy.retry.client.model.ExecuteResult; -import com.aizuda.easy.retry.common.core.enums.JobOperationReasonEnum; import com.aizuda.easy.retry.common.core.enums.JobTaskBatchStatusEnum; -import com.aizuda.easy.retry.common.core.enums.JobTaskStatusEnum; import com.aizuda.easy.retry.server.common.enums.JobTaskExecutorSceneEnum; import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; import com.aizuda.easy.retry.server.job.task.dto.WorkflowNodeTaskExecuteDTO; -import com.aizuda.easy.retry.server.job.task.support.ClientCallbackHandler; -import com.aizuda.easy.retry.server.job.task.support.JobExecutor; -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.callback.ClientCallbackContext; -import com.aizuda.easy.retry.server.job.task.support.callback.ClientCallbackFactory; -import com.aizuda.easy.retry.server.job.task.support.executor.job.JobExecutorContext; -import com.aizuda.easy.retry.server.job.task.support.executor.job.JobExecutorFactory; import com.aizuda.easy.retry.server.job.task.support.handler.WorkflowBatchHandler; -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.service.WorkflowNodeService; import com.aizuda.easy.retry.server.web.service.handler.JobHandler; import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper; import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobTaskBatchMapper; -import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobTaskMapper; -import com.aizuda.easy.retry.template.datasource.persistence.po.Job; -import com.aizuda.easy.retry.template.datasource.persistence.po.JobTask; import com.aizuda.easy.retry.template.datasource.persistence.po.JobTaskBatch; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor;