From b3c4cd92c1d5023be9038133bde3e8c306cd5f31 Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Sat, 14 Oct 2023 17:08:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:2.4.0=201.=20=E5=AE=8C=E6=88=90=E7=9A=84?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=B0=E7=9A=84=E6=97=A5=E5=BF=97=20?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=20=E6=89=B9=E6=AC=A1=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5=E5=92=8C=E8=AF=A6=E6=83=85=E9=A1=B5=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/JobTaskStatusEnum.java | 2 - .../mysql/mapper/JobLogMessageMapper.xml | 3 +- .../server/common/client/RequestBuilder.java | 14 +- .../job/task/support/JobTaskConverter.java | 9 +- .../support/dispatch/JobExecutorActor.java | 5 +- .../task/support/dispatch/JobLogActor.java | 2 +- .../executor/BroadcastTaskJobExecutor.java | 3 +- .../support/executor/ClusterJobExecutor.java | 3 +- .../support/executor/JobExecutorContext.java | 34 +- .../executor/RealJobExecutorActor.java | 1 - .../support/executor/ShardingJobExecutor.java | 3 +- .../task/support/stop/RealStopTaskActor.java | 6 +- .../retry/task/client/RetryRpcClient.java | 4 +- .../retry/task/support/RetryContext.java | 7 + .../support/context/CallbackRetryContext.java | 11 + .../MaxAttemptsPersistenceRetryContext.java | 12 + .../actor/exec/ExecCallbackUnitActor.java | 30 +- .../dispatch/actor/exec/ExecUnitActor.java | 25 +- .../dispatch/task/CallbackTaskExecutor.java | 1 + .../task/ManualCallbackTaskExecutor.java | 1 + .../task/ManualRetryTaskExecutor.java | 4 +- .../dispatch/task/RetryTaskExecutor.java | 2 +- .../service/impl/RetryTaskServiceImpl.java | 6 +- frontend/src/api/jobApi.js | 23 +- frontend/src/config/router.config.js | 23 +- frontend/src/utils/enum.js | 149 ++++++ frontend/src/views/job/JobBatchInfo.vue | 80 ++++ .../job/{JobBatch.vue => JobBatchList.vue} | 116 +---- frontend/src/views/job/JobInfo.vue | 72 ++- frontend/src/views/job/JobList.vue | 58 +-- frontend/src/views/job/JobLogMessageList.vue | 81 ++++ frontend/src/views/job/JobTask.vue | 445 ------------------ frontend/src/views/job/JobTaskList.vue | 325 +++++++++++++ 33 files changed, 870 insertions(+), 690 deletions(-) create mode 100644 frontend/src/utils/enum.js create mode 100644 frontend/src/views/job/JobBatchInfo.vue rename frontend/src/views/job/{JobBatch.vue => JobBatchList.vue} (80%) create mode 100644 frontend/src/views/job/JobLogMessageList.vue delete mode 100644 frontend/src/views/job/JobTask.vue create mode 100644 frontend/src/views/job/JobTaskList.vue diff --git a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobTaskStatusEnum.java b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobTaskStatusEnum.java index bc7914f2..a926720f 100644 --- a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobTaskStatusEnum.java +++ b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/enums/JobTaskStatusEnum.java @@ -35,8 +35,6 @@ public enum JobTaskStatusEnum { * 任务停止 */ STOP(5), - - ; private final int status; diff --git a/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobLogMessageMapper.xml b/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobLogMessageMapper.xml index 24a647ab..6c87b753 100644 --- a/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobLogMessageMapper.xml +++ b/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobLogMessageMapper.xml @@ -8,7 +8,8 @@ - + + diff --git a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/client/RequestBuilder.java b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/client/RequestBuilder.java index b1108e88..107a8849 100644 --- a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/client/RequestBuilder.java +++ b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/client/RequestBuilder.java @@ -18,7 +18,6 @@ import java.util.Objects; public class RequestBuilder { private Class clintInterface; - private String groupName; private RegisterNodeInfo nodeInfo; private boolean failRetry; private int retryTimes = 3; @@ -43,10 +42,10 @@ public class RequestBuilder { return this; } - public RequestBuilder groupName(String groupName) { - this.groupName = groupName; - return this; - } +// public RequestBuilder groupName(String groupName) { +// this.groupName = groupName; +// return this; +// } public RequestBuilder failRetry(boolean failRetry) { this.failRetry = failRetry; @@ -68,7 +67,7 @@ public class RequestBuilder { return this; } - public RequestBuilder allocKey(boolean failover) { + public RequestBuilder failover(boolean failover) { this.failover = failover; return this; } @@ -89,7 +88,6 @@ public class RequestBuilder { throw new EasyRetryServerException("clintInterface cannot be null"); } - Assert.notBlank(groupName, () -> new EasyRetryServerException("groupName cannot be null")); Assert.notNull(nodeInfo, () -> new EasyRetryServerException("nodeInfo cannot be null")); if (failover) { @@ -103,7 +101,7 @@ public class RequestBuilder { } RpcClientInvokeHandler clientInvokeHandler = new RpcClientInvokeHandler( - groupName, nodeInfo, failRetry, retryTimes, retryInterval, retryListener, routeKey, allocKey, failover); + nodeInfo.getGroupName(), nodeInfo, failRetry, retryTimes, retryInterval, retryListener, routeKey, allocKey, failover); return (T) Proxy.newProxyInstance(clintInterface.getClassLoader(), new Class[]{clintInterface}, clientInvokeHandler); diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/JobTaskConverter.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/JobTaskConverter.java index 6ecc1ab3..e329b9ff 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/JobTaskConverter.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/JobTaskConverter.java @@ -65,13 +65,18 @@ public interface JobTaskConverter { DispatchJobRequest toDispatchJobRequest(RealJobExecutorDTO realJobExecutorDTO); @Mappings({ - @Mapping(source = "job.groupName", target = "groupName"), + @Mapping(source = "jobTask.groupName", target = "groupName"), + @Mapping(source = "jobTask.jobId", target = "jobId"), + @Mapping(source = "jobTask.taskBatchId", target = "taskBatchId"), + @Mapping(source = "jobTask.clientId", target = "clientId"), @Mapping(source = "jobTask.id", target = "taskId"), @Mapping(source = "jobTask.argsStr", target = "argsStr"), @Mapping(source = "jobTask.argsType", target = "argsType"), @Mapping(source = "jobTask.extAttrs", target = "extAttrs") }) - RealJobExecutorDTO toRealJobExecutorDTO(Job job, JobTask jobTask); + RealJobExecutorDTO toRealJobExecutorDTO(JobExecutorContext context, JobTask jobTask); + + JobExecutorContext toJobExecutorContext(Job job); JobExecutorResultDTO toJobExecutorResultDTO(ClientCallbackContext context); diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobExecutorActor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobExecutorActor.java index a41f1ea5..18771296 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobExecutorActor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobExecutorActor.java @@ -5,6 +5,7 @@ import com.aizuda.easy.retry.common.core.log.LogUtils; import com.aizuda.easy.retry.server.common.akka.ActorGenerator; import com.aizuda.easy.retry.server.job.task.dto.TaskExecuteDTO; 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.executor.JobExecutorContext; import com.aizuda.easy.retry.server.job.task.support.executor.JobExecutorFactory; import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper; @@ -44,12 +45,10 @@ public class JobExecutorActor extends AbstractActor { Job job = jobMapper.selectById(taskExecute.getJobId()); JobExecutor jobExecutor = JobExecutorFactory.getJobExecutor(job.getTaskType()); - JobExecutorContext context = new JobExecutorContext(); + JobExecutorContext context = JobTaskConverter.INSTANCE.toJobExecutorContext(job); context.setTaskBatchId(taskExecute.getTaskBatchId()); - context.setGroupName(taskExecute.getGroupName()); context.setJobId(job.getId()); context.setTaskType(job.getTaskType()); - context.setJob(job); jobExecutor.execute(context); } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobLogActor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobLogActor.java index ea76a330..e71f1fb9 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobLogActor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/dispatch/JobLogActor.java @@ -49,7 +49,7 @@ public class JobLogActor extends AbstractActor { JobLogMessage jobLogMessage = JobTaskConverter.INSTANCE.toJobLogMessage(jobLogDTO); if (Objects.nonNull(jobLogDTO.getClientId())) { Optional.ofNullable(CacheRegisterTable.getServerNode(jobLogDTO.getGroupName(), jobLogDTO.getClientId())).ifPresent(registerNodeInfo -> { - jobLogMessage.setClientAddress(registerNodeInfo.fullUrl()); + jobLogMessage.setClientAddress(registerNodeInfo.address()); }); } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/BroadcastTaskJobExecutor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/BroadcastTaskJobExecutor.java index e0bc7c4f..22f84936 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/BroadcastTaskJobExecutor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/BroadcastTaskJobExecutor.java @@ -29,11 +29,10 @@ public class BroadcastTaskJobExecutor extends AbstractJobExecutor { @Override protected void doExecute(JobExecutorContext context) { - Job job = context.getJob(); List taskList = context.getTaskList(); for (JobTask jobTask : taskList) { - RealJobExecutorDTO realJobExecutor = JobTaskConverter.INSTANCE.toRealJobExecutorDTO(job, jobTask); + RealJobExecutorDTO realJobExecutor = JobTaskConverter.INSTANCE.toRealJobExecutorDTO(context, jobTask); ActorRef actorRef = ActorGenerator.jobRealTaskExecutorActor(); actorRef.tell(realJobExecutor, actorRef); } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ClusterJobExecutor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ClusterJobExecutor.java index d12c293e..b7c5a47b 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ClusterJobExecutor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ClusterJobExecutor.java @@ -31,9 +31,8 @@ public class ClusterJobExecutor extends AbstractJobExecutor { protected void doExecute(JobExecutorContext context) { // 调度客户端 - Job job = context.getJob(); List taskList = context.getTaskList(); - RealJobExecutorDTO realJobExecutor = JobTaskConverter.INSTANCE.toRealJobExecutorDTO(job, taskList.get(0)); + RealJobExecutorDTO realJobExecutor = JobTaskConverter.INSTANCE.toRealJobExecutorDTO(context, taskList.get(0)); ActorRef actorRef = ActorGenerator.jobRealTaskExecutorActor(); actorRef.tell(realJobExecutor, actorRef); diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/JobExecutorContext.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/JobExecutorContext.java index 3001e200..e8daaa27 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/JobExecutorContext.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/JobExecutorContext.java @@ -1,6 +1,5 @@ package com.aizuda.easy.retry.server.job.task.support.executor; -import com.aizuda.easy.retry.template.datasource.persistence.po.Job; import com.aizuda.easy.retry.template.datasource.persistence.po.JobTask; import lombok.Data; @@ -48,4 +47,37 @@ public class JobExecutorContext { private Integer routeKey; + /** + * 扩展字段 + */ + private String extAttrs; + + + + private Long taskId; + + + private Integer parallelNum; + + private Integer executorType; + + private String executorName; + + private String clientId; + + /** + * 最大重试次数 + */ + private Integer maxRetryTimes; + + /** + * 重试间隔(s) + */ + private Integer retryInterval; + + private Integer shardingTotal; + + private Integer shardingIndex; + + private Integer executorTimeout; } diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/RealJobExecutorActor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/RealJobExecutorActor.java index 9cda79d8..b9503066 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/RealJobExecutorActor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/RealJobExecutorActor.java @@ -115,7 +115,6 @@ public class RealJobExecutorActor extends AbstractActor { private JobRpcClient buildRpcClient(RegisterNodeInfo registerNodeInfo, RealJobExecutorDTO realJobExecutorDTO) { return RequestBuilder.newBuilder() - .groupName(registerNodeInfo.getGroupName()) .nodeInfo(registerNodeInfo) .failRetry(Boolean.TRUE) .retryTimes(realJobExecutorDTO.getMaxRetryTimes()) diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ShardingJobExecutor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ShardingJobExecutor.java index 7d1dbbd0..cc32653b 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ShardingJobExecutor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/executor/ShardingJobExecutor.java @@ -30,10 +30,9 @@ public class ShardingJobExecutor extends AbstractJobExecutor { @Override protected void doExecute(JobExecutorContext context) { - Job job = context.getJob(); List taskList = context.getTaskList(); for (int i = 0; i < taskList.size(); i++) { - RealJobExecutorDTO realJobExecutor = JobTaskConverter.INSTANCE.toRealJobExecutorDTO(job, taskList.get(i)); + RealJobExecutorDTO realJobExecutor = JobTaskConverter.INSTANCE.toRealJobExecutorDTO(context, taskList.get(i)); realJobExecutor.setShardingIndex(i); realJobExecutor.setShardingTotal(taskList.size()); ActorRef actorRef = ActorGenerator.jobRealTaskExecutorActor(); diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/stop/RealStopTaskActor.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/stop/RealStopTaskActor.java index 76e85d07..ff982505 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/stop/RealStopTaskActor.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/stop/RealStopTaskActor.java @@ -49,11 +49,7 @@ public class RealStopTaskActor extends AbstractActor { private Result requestClient(RealStopTaskInstanceDTO realStopTaskInstanceDTO, RegisterNodeInfo registerNodeInfo) { JobRpcClient rpcClient = RequestBuilder.newBuilder() - .hostPort(registerNodeInfo.getHostPort()) - .groupName(realStopTaskInstanceDTO.getGroupName()) - .hostId(registerNodeInfo.getHostId()) - .hostIp(registerNodeInfo.getHostIp()) - .contextPath(registerNodeInfo.getContextPath()) + .nodeInfo(registerNodeInfo) .failRetry(Boolean.TRUE) .retryTimes(3) .retryInterval(1) diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/client/RetryRpcClient.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/client/RetryRpcClient.java index 8fde7564..01ff454b 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/client/RetryRpcClient.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/client/RetryRpcClient.java @@ -22,10 +22,10 @@ import com.aizuda.easy.retry.server.common.client.annotation.Mapping; */ public interface RetryRpcClient { - @Mapping(path = "/retry/dispatch/v1", method = RequestMethod.POST, failover = true) + @Mapping(path = "/retry/dispatch/v1", method = RequestMethod.POST) Result dispatch(@Body DispatchRetryDTO dispatchRetryDTO, @Header EasyRetryHeaders headers); - @Mapping(path = "/retry/callback/v1", method = RequestMethod.POST, failover = true) + @Mapping(path = "/retry/callback/v1", method = RequestMethod.POST) Result callback(@Body RetryCallbackDTO retryCallbackDTO); @Mapping(path = "/retry/generate/idempotent-id/v1", method = RequestMethod.POST) diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/RetryContext.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/RetryContext.java index b9ec9f1e..71986169 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/RetryContext.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/RetryContext.java @@ -2,6 +2,7 @@ package com.aizuda.easy.retry.server.retry.task.support; import com.aizuda.easy.retry.server.common.dto.RegisterNodeInfo; import com.aizuda.easy.retry.template.datasource.persistence.po.RetryTask; +import com.aizuda.easy.retry.template.datasource.persistence.po.SceneConfig; import java.util.Set; @@ -74,4 +75,10 @@ public interface RetryContext { */ Set getSceneBlacklist(); + /** + * 路由策略 + * + * @return 路由策略 + */ + SceneConfig sceneConfig(); } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/CallbackRetryContext.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/CallbackRetryContext.java index e3556118..369e0307 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/CallbackRetryContext.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/CallbackRetryContext.java @@ -4,6 +4,7 @@ import com.aizuda.easy.retry.server.common.dto.RegisterNodeInfo; import com.aizuda.easy.retry.server.retry.task.support.RetryContext; import com.aizuda.easy.retry.server.retry.task.support.WaitStrategy; import com.aizuda.easy.retry.template.datasource.persistence.po.RetryTask; +import com.aizuda.easy.retry.template.datasource.persistence.po.SceneConfig; import lombok.Data; import java.util.Objects; @@ -47,9 +48,19 @@ public class CallbackRetryContext implements RetryContext { */ private RegisterNodeInfo serverNode; + /** + * 场景配置 + */ + private SceneConfig sceneConfig; + @Override public boolean hasException() { return Objects.nonNull(exception); } + @Override + public SceneConfig sceneConfig() { + return sceneConfig; + } + } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/MaxAttemptsPersistenceRetryContext.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/MaxAttemptsPersistenceRetryContext.java index 447dc076..b1e9b40e 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/MaxAttemptsPersistenceRetryContext.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/context/MaxAttemptsPersistenceRetryContext.java @@ -4,6 +4,7 @@ import com.aizuda.easy.retry.server.common.dto.RegisterNodeInfo; import com.aizuda.easy.retry.server.retry.task.support.RetryContext; import com.aizuda.easy.retry.server.retry.task.support.WaitStrategy; import com.aizuda.easy.retry.template.datasource.persistence.po.RetryTask; +import com.aizuda.easy.retry.template.datasource.persistence.po.SceneConfig; import lombok.Data; import lombok.Getter; @@ -50,6 +51,11 @@ public class MaxAttemptsPersistenceRetryContext implements RetryContext { */ private RegisterNodeInfo serverNode; + /** + * 场景配置 + */ + private SceneConfig sceneConfig; + @Override public void setCallResult(V v) { this.callResult = v; @@ -64,4 +70,10 @@ public class MaxAttemptsPersistenceRetryContext implements RetryContext { public boolean hasException() { return Objects.nonNull(exception); } + + @Override + public SceneConfig sceneConfig() { + return sceneConfig; + } + } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecCallbackUnitActor.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecCallbackUnitActor.java index 3ab40304..ceefcdeb 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecCallbackUnitActor.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecCallbackUnitActor.java @@ -22,6 +22,7 @@ import com.aizuda.easy.retry.server.retry.task.support.retry.RetryExecutor; import com.aizuda.easy.retry.template.datasource.access.AccessTemplate; import com.aizuda.easy.retry.template.datasource.access.TaskAccess; import com.aizuda.easy.retry.template.datasource.persistence.po.RetryTask; +import com.aizuda.easy.retry.template.datasource.persistence.po.SceneConfig; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import lombok.extern.slf4j.Slf4j; @@ -44,7 +45,7 @@ import java.util.concurrent.Callable; @Component(ActorGenerator.EXEC_CALLBACK_UNIT_ACTOR) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Slf4j -public class ExecCallbackUnitActor extends AbstractActor { +public class ExecCallbackUnitActor extends AbstractActor { @Autowired @Qualifier("bitSetIdempotentStrategyHandler") @@ -61,6 +62,7 @@ public class ExecCallbackUnitActor extends AbstractActor { CallbackRetryContext context = (CallbackRetryContext) retryExecutor.getRetryContext(); RetryTask retryTask = context.getRetryTask(); RegisterNodeInfo serverNode = context.getServerNode(); + SceneConfig sceneConfig = context.getSceneConfig(); RetryTaskLogDTO retryTaskLog = new RetryTaskLogDTO(); retryTaskLog.setGroupName(retryTask.getGroupName()); @@ -70,7 +72,7 @@ public class ExecCallbackUnitActor extends AbstractActor { if (Objects.nonNull(serverNode)) { retryExecutor.call((Callable>) () -> { - Result result = callClient(retryTask, serverNode); + Result result = callClient(retryTask, serverNode, sceneConfig); String message = "回调客户端成功"; if (StatusEnum.YES.getStatus() != result.getStatus()) { @@ -90,7 +92,7 @@ public class ExecCallbackUnitActor extends AbstractActor { retryTaskLog.setMessage("There are currently no available client PODs."); } - }catch (Exception e) { + } catch (Exception e) { LogUtils.error(log, "callback client error. retryTask:[{}]", JsonUtil.toJsonString(retryTask), e); retryTaskLog.setMessage(StringUtils.isBlank(e.getMessage()) ? StrUtil.EMPTY : e.getMessage()); } finally { @@ -114,15 +116,15 @@ public class ExecCallbackUnitActor extends AbstractActor { * @param callbackTask {@link RetryTask} 回调任务 * @return 重试结果返回值 */ - private Result callClient(RetryTask callbackTask, RegisterNodeInfo serverNode) { + private Result callClient(RetryTask callbackTask, RegisterNodeInfo serverNode, SceneConfig sceneConfig) { String retryTaskUniqueId = callbackRetryTaskHandler.getRetryTaskUniqueId(callbackTask.getUniqueId()); TaskAccess retryTaskAccess = accessTemplate.getRetryTaskAccess(); RetryTask retryTask = retryTaskAccess.one(callbackTask.getGroupName(), - new LambdaQueryWrapper().eq(RetryTask::getUniqueId, retryTaskUniqueId)); + new LambdaQueryWrapper().eq(RetryTask::getUniqueId, retryTaskUniqueId)); Assert.notNull(retryTask, () -> new EasyRetryServerException("未查询回调任务对应的重试任务. callbackUniqueId:[{}] uniqueId:[{}]", - callbackTask.getUniqueId(), retryTaskUniqueId)); + callbackTask.getUniqueId(), retryTaskUniqueId)); // 回调参数 RetryCallbackDTO retryCallbackDTO = new RetryCallbackDTO(); @@ -136,17 +138,13 @@ public class ExecCallbackUnitActor extends AbstractActor { retryCallbackDTO.setUniqueId(callbackTask.getUniqueId()); RetryRpcClient rpcClient = RequestBuilder.newBuilder() - .hostPort(serverNode.getHostPort()) - .groupName(serverNode.getGroupName()) - .hostId(serverNode.getHostId()) - .hostIp(serverNode.getHostIp()) - .contextPath(serverNode.getContextPath()) - .client(RetryRpcClient.class) - .build(); - + .nodeInfo(serverNode) + .failover(Boolean.TRUE) + .routeKey(sceneConfig.getRouteKey()) + .allocKey(sceneConfig.getSceneName()) + .client(RetryRpcClient.class) + .build(); return rpcClient.callback(retryCallbackDTO); } - - } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecUnitActor.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecUnitActor.java index c5c7b71a..12ad3ddf 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecUnitActor.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/actor/exec/ExecUnitActor.java @@ -21,6 +21,7 @@ import com.aizuda.easy.retry.server.retry.task.support.context.MaxAttemptsPersis import com.aizuda.easy.retry.server.retry.task.support.dispatch.actor.log.RetryTaskLogDTO; import com.aizuda.easy.retry.server.retry.task.support.retry.RetryExecutor; import com.aizuda.easy.retry.template.datasource.persistence.po.RetryTask; +import com.aizuda.easy.retry.template.datasource.persistence.po.SceneConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -42,7 +43,7 @@ import java.util.concurrent.Callable; @Component(ActorGenerator.EXEC_UNIT_ACTOR) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Slf4j -public class ExecUnitActor extends AbstractActor { +public class ExecUnitActor extends AbstractActor { @Autowired @Qualifier("bitSetIdempotentStrategyHandler") @@ -55,6 +56,7 @@ public class ExecUnitActor extends AbstractActor { MaxAttemptsPersistenceRetryContext context = (MaxAttemptsPersistenceRetryContext) retryExecutor.getRetryContext(); RetryTask retryTask = context.getRetryTask(); RegisterNodeInfo serverNode = context.getServerNode(); + SceneConfig sceneConfig = context.getSceneConfig(); RetryTaskLogDTO retryTaskLog = new RetryTaskLogDTO(); retryTaskLog.setGroupName(retryTask.getGroupName()); @@ -67,7 +69,7 @@ public class ExecUnitActor extends AbstractActor { retryExecutor.call((Callable>) () -> { - Result result = callClient(retryTask, serverNode); + Result result = callClient(retryTask, serverNode, sceneConfig); // 回调接口请求成功,处理返回值 if (StatusEnum.YES.getStatus() != result.getStatus()) { @@ -106,7 +108,7 @@ public class ExecUnitActor extends AbstractActor { retryTaskLog.setMessage("There are currently no available client PODs."); } - }catch (Exception e) { + } catch (Exception e) { LogUtils.error(log, "callback client error. retryTask:[{}]", JsonUtil.toJsonString(retryTask), e); retryTaskLog.setMessage(e.getMessage()); } finally { @@ -128,7 +130,7 @@ public class ExecUnitActor extends AbstractActor { * @param retryTask {@link RetryTask} 需要重试的数据 * @return 重试结果返回值 */ - private Result callClient(RetryTask retryTask, RegisterNodeInfo serverNode) { + private Result callClient(RetryTask retryTask, RegisterNodeInfo serverNode, SceneConfig sceneConfig) { DispatchRetryDTO dispatchRetryDTO = new DispatchRetryDTO(); dispatchRetryDTO.setIdempotentId(retryTask.getIdempotentId()); @@ -139,20 +141,17 @@ public class ExecUnitActor extends AbstractActor { dispatchRetryDTO.setRetryCount(retryTask.getRetryCount()); // 设置header - HttpHeaders requestHeaders = new HttpHeaders(); EasyRetryHeaders easyRetryHeaders = new EasyRetryHeaders(); easyRetryHeaders.setEasyRetry(Boolean.TRUE); easyRetryHeaders.setEasyRetryId(retryTask.getUniqueId()); - requestHeaders.add(SystemConstants.EASY_RETRY_HEAD_KEY, JsonUtil.toJsonString(easyRetryHeaders)); RetryRpcClient rpcClient = RequestBuilder.newBuilder() - .hostPort(serverNode.getHostPort()) - .groupName(serverNode.getGroupName()) - .hostId(serverNode.getHostId()) - .hostIp(serverNode.getHostIp()) - .contextPath(serverNode.getContextPath()) - .client(RetryRpcClient.class) - .build(); + .nodeInfo(serverNode) + .failover(Boolean.TRUE) + .allocKey(retryTask.getSceneName()) + .routeKey(sceneConfig.getRouteKey()) + .client(RetryRpcClient.class) + .build(); return rpcClient.dispatch(dispatchRetryDTO, easyRetryHeaders); } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/CallbackTaskExecutor.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/CallbackTaskExecutor.java index e7c0c80d..cf26d555 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/CallbackTaskExecutor.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/CallbackTaskExecutor.java @@ -35,6 +35,7 @@ public class CallbackTaskExecutor extends AbstractTaskExecutor { retryContext.setServerNode( clientNodeAllocateHandler.getServerNode(retryTask.getSceneName(), retryTask.getGroupName(), sceneConfig.getRouteKey())); + retryContext.setSceneConfig(sceneConfig); return retryContext; } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualCallbackTaskExecutor.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualCallbackTaskExecutor.java index 1d922c8b..12ab4111 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualCallbackTaskExecutor.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualCallbackTaskExecutor.java @@ -38,6 +38,7 @@ public class ManualCallbackTaskExecutor extends AbstractTaskExecutor { retryContext.setServerNode( clientNodeAllocateHandler.getServerNode(retryTask.getSceneName(), retryTask.getGroupName(), sceneConfig.getRouteKey())); + retryContext.setSceneConfig(sceneConfig); return retryContext; } diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualRetryTaskExecutor.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualRetryTaskExecutor.java index 784ed9ca..1f27b828 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualRetryTaskExecutor.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/ManualRetryTaskExecutor.java @@ -38,7 +38,9 @@ public class ManualRetryTaskExecutor extends AbstractTaskExecutor { retryContext.setSceneBlacklist(accessTemplate.getSceneConfigAccess().getBlacklist(groupName)); retryContext.setServerNode( clientNodeAllocateHandler.getServerNode(retryTask.getSceneName(), retryTask.getGroupName(), - sceneConfig.getRouteKey())); return retryContext; + sceneConfig.getRouteKey())); + retryContext.setSceneConfig(sceneConfig); + return retryContext; } @Override diff --git a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/RetryTaskExecutor.java b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/RetryTaskExecutor.java index bef00d12..7f0c5c03 100644 --- a/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/RetryTaskExecutor.java +++ b/easy-retry-server/easy-retry-server-retry-task/src/main/java/com/aizuda/easy/retry/server/retry/task/support/dispatch/task/RetryTaskExecutor.java @@ -36,6 +36,7 @@ public class RetryTaskExecutor extends AbstractTaskExecutor { retryContext.setServerNode( clientNodeAllocateHandler.getServerNode(retryTask.getSceneName(), retryTask.getGroupName(), sceneConfig.getRouteKey())); + retryContext.setSceneConfig(sceneConfig); return retryContext; } @@ -43,7 +44,6 @@ public class RetryTaskExecutor extends AbstractTaskExecutor { protected RetryExecutor> builderResultRetryExecutor(RetryContext retryContext, final SceneConfig sceneConfig) { - RetryTask retryTask = retryContext.getRetryTask(); return RetryBuilder.>newBuilder() .withStopStrategy(StopStrategies.stopException()) .withStopStrategy(StopStrategies.stopResultStatusCode()) diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/RetryTaskServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/RetryTaskServiceImpl.java index 15ef74de..b134fd7e 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/RetryTaskServiceImpl.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/RetryTaskServiceImpl.java @@ -226,11 +226,7 @@ public class RetryTaskServiceImpl implements RetryTaskService { generateRetryIdempotentIdDTO.setExecutorName(generateRetryIdempotentIdVO.getExecutorName()); RetryRpcClient rpcClient = RequestBuilder.newBuilder() - .hostPort(serverNode.getHostPort()) - .groupName(serverNode.getGroupName()) - .hostId(serverNode.getHostId()) - .hostIp(serverNode.getHostIp()) - .contextPath(serverNode.getContextPath()) + .nodeInfo(serverNode) .client(RetryRpcClient.class) .build(); diff --git a/frontend/src/api/jobApi.js b/frontend/src/api/jobApi.js index 316d2172..cde1315c 100644 --- a/frontend/src/api/jobApi.js +++ b/frontend/src/api/jobApi.js @@ -8,12 +8,33 @@ const jobApi = { // 任务批次 jobBatchList: '/job/batch/list', - jobBatchDetail: '/job/batch/' + jobBatchDetail: '/job/batch/', + // 任务 + jobTaskList: '/job/task/list', + + // 日志 + jobLogList: '/job/log/list' } export default jobApi +export function jobLogList (parameter) { + return request({ + url: jobApi.jobLogList, + method: 'get', + params: parameter + }) +} + +export function jobTaskList (parameter) { + return request({ + url: jobApi.jobTaskList, + method: 'get', + params: parameter + }) +} + export function jobBatchList (parameter) { return request({ url: jobApi.jobBatchList, diff --git a/frontend/src/config/router.config.js b/frontend/src/config/router.config.js index a142f622..48791071 100644 --- a/frontend/src/config/router.config.js +++ b/frontend/src/config/router.config.js @@ -143,15 +143,30 @@ export const asyncRouterMap = [ }, { path: '/job/batch/list', - name: 'JobBatch', - component: () => import('@/views/job/JobBatch'), + name: 'JobBatchList', + component: () => import('@/views/job/JobBatchList'), meta: { title: '任务批次', icon: 'profile', permission: ['retryLog'] } }, + { + path: '/job/batch/info', + name: 'JobBatchInfo', + hidden: true, + component: () => import('@/views/job/JobBatchInfo'), + meta: { title: '任务批次详情', icon: 'profile', permission: ['retryLog'] } + }, { path: '/job/task/list', - name: 'JobTask', - component: () => import('@/views/job/JobTask'), + name: 'JobTaskList', + hidden: true, + component: () => import('@/views/job/JobTaskList'), meta: { title: '任务项', icon: 'profile', permission: ['retryLog'] } + }, + { + path: '/job/log/list', + name: 'JobLogMessageList', + hidden: true, + component: () => import('@/views/job/JobLogMessageList'), + meta: { title: '任务调度日志', icon: 'profile', permission: ['retryLog'] } } ] }, diff --git a/frontend/src/utils/enum.js b/frontend/src/utils/enum.js new file mode 100644 index 00000000..88aad398 --- /dev/null +++ b/frontend/src/utils/enum.js @@ -0,0 +1,149 @@ +const enums = { + jobStatusEnum: { + '0': { + 'name': '关闭', + 'color': '#9c1f1f' + }, + '1': { + 'name': '开启', + 'color': '#f5a22d' + } + }, + taskType: { + '1': { + 'name': '集群模式', + 'color': '#d06892' + }, + '2': { + 'name': '广播模式', + 'color': '#f5a22d' + }, + '3': { + 'name': '分片模式', + 'color': '#e1f52d' + } + }, + triggerType: { + '1': { + 'name': 'CRON表达式', + 'color': '#d06892' + }, + '2': { + 'name': '固定时间', + 'color': '#f5a22d' + } + }, + blockStrategy: { + '1': { + 'name': '丢弃策略', + 'color': '#d06892' + }, + '2': { + 'name': '覆盖', + 'color': '#f5a22d' + }, + '3': { + 'name': '并行', + 'color': '#e1f52d' + } + }, + executorType: { + '1': { + 'name': 'Java', + 'color': '#d06892' + } + }, + routeKey: { + '4': { + 'name': '轮询', + 'color': '#8f68d2' + }, + '1': { + 'name': '一致性Hash', + 'color': '#d06892' + }, + '2': { + 'name': '随机', + 'color': '#f5a22d' + }, + '3': { + 'name': 'LRU', + 'color': '#e1f52d' + } + }, + taskStatus: { + '1': { + 'name': '待处理', + 'color': '#64a6ea' + }, + '2': { + 'name': '运行中', + 'color': '#1b7ee5' + }, + '3': { + 'name': '成功', + 'color': '#087da1' + }, + '4': { + 'name': '失败', + 'color': '#f52d80' + }, + '5': { + 'name': '停止', + 'color': '#ac2df5' + }, + '6': { + 'name': '取消', + 'color': '#f5732d' + } + }, + operationReason: { + '0': { + 'name': '' + }, + '1': { + 'name': '执行超时', + 'color': '#64a6ea' + }, + '2': { + 'name': '无客户端节点', + 'color': '#1b7ee5' + }, + '3': { + 'name': '任务已关闭', + 'color': '#087da1' + } + // '4': { + // 'name': '失败', + // 'color': '#f52d80' + // }, + // '5': { + // 'name': '停止', + // 'color': '#ac2df5' + // }, + // '6': { + // 'name': '取消', + // 'color': '#f5732d' + // } + }, + executeStatus: { + '2': { + 'name': '运行中', + 'color': '#1b7ee5' + }, + '3': { + 'name': '成功', + 'color': '#087da1' + }, + '4': { + 'name': '失败', + 'color': '#f52d80' + }, + '5': { + 'name': '停止', + 'color': '#ac2df5' + } + } +} + +module.exports = enums diff --git a/frontend/src/views/job/JobBatchInfo.vue b/frontend/src/views/job/JobBatchInfo.vue new file mode 100644 index 00000000..8aa0e44d --- /dev/null +++ b/frontend/src/views/job/JobBatchInfo.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/frontend/src/views/job/JobBatch.vue b/frontend/src/views/job/JobBatchList.vue similarity index 80% rename from frontend/src/views/job/JobBatch.vue rename to frontend/src/views/job/JobBatchList.vue index 64004ec2..48c68c49 100644 --- a/frontend/src/views/job/JobBatch.vue +++ b/frontend/src/views/job/JobBatchList.vue @@ -66,8 +66,6 @@
- 新增 - 删除 @@ -89,31 +87,13 @@ {{ record.id }} - - - {{ taskType[text].name }} - - {{ taskStatus[text].name }} - - - {{ triggerType[text].name }} - - - - - {{ blockStrategy[text].name }} - - - - {{ text }}(秒) - - - {{ text }}(秒) + + {{ operationReason[text].name }}