From ce4163ceb0aab8e8d6ae7d05f24665698a596016 Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Fri, 28 Apr 2023 11:24:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=201.1.0=201.=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=89=A7=E8=A1=8C=E5=99=A8=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=202.=20=E4=BC=98=E5=8C=96=E6=A0=B8=E5=BF=83=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=203.=20Assert=E4=BC=98=E5=8C=96=E4=BD=BF?= =?UTF-8?q?=E7=94=A8hutool=E7=9A=84Assert=204.=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../easy/retry/client/core/BizIdGenerate.java | 23 +++++ .../client/core/annotation/Retryable.java | 19 ++++- .../client/core/client/RetryEndPoint.java | 11 ++- .../core/generator/SimpleBizIdGenerate.java | 2 + .../GlobalRestfulResponseBodyAdvice.java | 2 +- .../easy/retry/common/core/util/Assert.java | 5 -- .../access/retry/MybatisRetryTaskAccess.java | 2 +- .../processor/RetryTaskAccessProcessor.java | 2 +- .../server/service/RetryTaskService.java | 32 +++++-- .../service/impl/GroupConfigServiceImpl.java | 18 ++-- .../impl/RetryDeadLetterServiceImpl.java | 4 +- .../server/service/impl/RetryServiceImpl.java | 6 +- .../service/impl/RetryTaskServiceImpl.java | 83 ++++++++++++++----- .../service/impl/SystemUserServiceImpl.java | 8 +- .../dispatch/actor/exec/ExecUnitActor.java | 2 +- .../dispatch/actor/result/FailureActor.java | 2 +- .../dispatch/actor/result/FinishActor.java | 2 +- .../web/controller/RetryTaskController.java | 18 ++-- .../model/request/RetryTaskSaveRequestVO.java | 4 +- .../RetryTaskUpdateExecutorNameRequestVO.java | 34 ++++++++ ...va => RetryTaskUpdateStatusRequestVO.java} | 10 ++- .../com/example/demo/TestEventListener.java | 2 +- 22 files changed, 219 insertions(+), 72 deletions(-) create mode 100644 easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateExecutorNameRequestVO.java rename easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/{RetryTaskRequestVO.java => RetryTaskUpdateStatusRequestVO.java} (60%) diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/BizIdGenerate.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/BizIdGenerate.java index 817aaac9a..a3d8414f7 100644 --- a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/BizIdGenerate.java +++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/BizIdGenerate.java @@ -1,10 +1,33 @@ package com.aizuda.easy.retry.client.core; /** + * 业务id生成器 + * 同一个组的同一个场景下只会存在一个相同的bizId重试任务, 若存在相同的则上报服务后会被幂等处理 + * 比如: + * 组: AGroup + * 场景: BScene + * 时刻1: 上报一个异常 bizId: A1 状态为重试中 + * 时刻2: 上报一个异常 bizId: A2 状态为重试中,可以上报成功,此时存在两个重试任务 + * 时刻3: 上报一个异常 bizId: A1 不会新增一个重试任务,会被幂等处理 + * 时刻4: bizId: A1 重试完成, 状态为已完成 + * 时刻5: 上报一个异常 bizId: A1 状态为重试中, 新增一条重试任务 + * * @author: www.byteblogs.com * @date : 2022-03-08 09:42 */ public interface BizIdGenerate { + /** + * 参数列表为Object一维数组, 下面说明每一个下标代表的数据含义 + * 0: 场景名称: scene(String) + * 1: 执行器名称: targetClassName(String) + * 2: 参数列表: args(Object[]) + * 3: 执行的方法名称: methodName(String) + * scene, targetClassName, args, executorMethod.getName() + * + * @param t 参数列表 + * @return bizId + * @throws Exception + */ String idGenerate(Object... t) throws Exception; } diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/annotation/Retryable.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/annotation/Retryable.java index 7c7616e7e..03f86e50f 100644 --- a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/annotation/Retryable.java +++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/annotation/Retryable.java @@ -49,9 +49,20 @@ public @interface Retryable { Class retryMethod() default RetryAnnotationMethod.class; /** - * 自定义业务id,默认为hash(param),传入成员列表,全部拼接取hash + * 业务id生成器 + * 同一个组的同一个场景下只会存在一个相同的bizId重试任务, 若存在相同的则上报服务后会被幂等处理 + * 比如: + * 组: AGroup + * 场景: BScene + * 时刻1: 上报一个异常 bizId: A1 状态为重试中 + * 时刻2: 上报一个异常 bizId: A2 状态为重试中,可以上报成功,此时存在两个重试任务 + * 时刻3: 上报一个异常 bizId: A1 不会新增一个重试任务,会被幂等处理 + * 时刻4: bizId: A1 重试完成, 状态为已完成 + * 时刻5: 上报一个异常 bizId: A1 状态为重试中, 新增一条重试任务 + ** + * 默认的bizId生成器{@link SimpleBizIdGenerate} 对所有参数进行MD5 * - * @return + * @return bizId */ Class bizId() default SimpleBizIdGenerate.class; @@ -63,7 +74,9 @@ public @interface Retryable { Class retryCompleteCallback() default SimpleRetryCompleteCallback.class; /** - * bizNo spel表达式 + * 用于标识具有业务特点的值, 比如订单号、物流编号等,可以根据具体的业务场景生成,生成规则采用通用成熟的Spel表达式进行解析 + * + * see: https://docs.spring.io/spring-framework/docs/5.0.0.M5/spring-framework-reference/html/expressions.html */ String bizNo() default ""; diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/client/RetryEndPoint.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/client/RetryEndPoint.java index bf2a0f002..fc915b551 100644 --- a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/client/RetryEndPoint.java +++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/client/RetryEndPoint.java @@ -17,6 +17,7 @@ import com.aizuda.easy.retry.common.core.enums.RetryResultStatusEnum; import com.aizuda.easy.retry.common.core.enums.RetryStatusEnum; import com.aizuda.easy.retry.common.core.log.LogUtils; import com.aizuda.easy.retry.common.core.model.Result; +import com.aizuda.easy.retry.common.core.util.Assert; import com.aizuda.easy.retry.common.core.util.JsonUtil; import com.aizuda.easy.retry.server.model.dto.ConfigDTO; import com.fasterxml.jackson.core.JsonProcessingException; @@ -37,6 +38,8 @@ import java.lang.reflect.Method; import java.util.Objects; /** + * 服务端调调用客户端进行重试流量下发、配置变更通知等操作 + * * @author: www.byteblogs.com * @date : 2022-03-09 16:33 */ @@ -137,19 +140,21 @@ public class RetryEndPoint { } /** - * 手动新增重试数据,模拟生成bizid + * 手动新增重试数据,模拟生成bizId * * @param generateRetryBizIdDTO 生成bizId模型 * @return bizId */ @PostMapping("/generate/biz-id") - public String bizIdGenerate(@RequestBody @Validated GenerateRetryBizIdDTO generateRetryBizIdDTO) { + public Result bizIdGenerate(@RequestBody @Validated GenerateRetryBizIdDTO generateRetryBizIdDTO) { String scene = generateRetryBizIdDTO.getScene(); String executorName = generateRetryBizIdDTO.getExecutorName(); String argsStr = generateRetryBizIdDTO.getArgsStr(); RetryerInfo retryerInfo = RetryerInfoCache.get(scene, executorName); + Assert.notNull(retryerInfo, ()-> new EasyRetryClientException("重试信息不存在 scene:[{}] executorName:[{}]", scene, executorName)); + Method executorMethod = retryerInfo.getExecutorMethod(); RetryArgSerializer retryArgSerializer = new JacksonSerializer(); @@ -173,6 +178,6 @@ public class RetryEndPoint { throw new EasyRetryClientException("bizId生成异常:{},{}", scene, argsStr); } - return bizId; + return new Result<>(bizId); } } diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/generator/SimpleBizIdGenerate.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/generator/SimpleBizIdGenerate.java index 0087fbd81..652af82f3 100644 --- a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/generator/SimpleBizIdGenerate.java +++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/generator/SimpleBizIdGenerate.java @@ -5,6 +5,8 @@ import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.common.core.util.JsonUtil; /** + * 默认的bizId 生成器 + * * @author: www.byteblogs.com * @date : 2022-03-08 09:42 */ diff --git a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/handler/GlobalRestfulResponseBodyAdvice.java b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/handler/GlobalRestfulResponseBodyAdvice.java index f81a80ec0..9e73e9fb3 100644 --- a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/handler/GlobalRestfulResponseBodyAdvice.java +++ b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/handler/GlobalRestfulResponseBodyAdvice.java @@ -14,7 +14,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.lang.annotation.Annotation; @Slf4j -@ControllerAdvice(basePackages = {"com.aizuda.easy.retry.client.core", "com.aizuda.easy.retry.server"}) +@ControllerAdvice(basePackages = {"com.aizuda.easy.retry.server"}) public class GlobalRestfulResponseBodyAdvice implements ResponseBodyAdvice { @Override diff --git a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/util/Assert.java b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/util/Assert.java index 065979ddc..8f8f41008 100644 --- a/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/util/Assert.java +++ b/easy-retry-common/easy-retry-common-core/src/main/java/com/aizuda/easy/retry/common/core/util/Assert.java @@ -6,9 +6,4 @@ package com.aizuda.easy.retry.common.core.util; */ public class Assert extends cn.hutool.core.lang.Assert { - public static void isTrue(boolean expression, T e) { - if (!expression) { - throw e; - } - } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/access/retry/MybatisRetryTaskAccess.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/access/retry/MybatisRetryTaskAccess.java index 95f73fbf4..46012a6ac 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/access/retry/MybatisRetryTaskAccess.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/access/retry/MybatisRetryTaskAccess.java @@ -67,7 +67,7 @@ public class MybatisRetryTaskAccess extends AbstractRetryTaskAccess { setPartition(retryTask.getGroupName()); int i = retryTaskMapper.insert(retryTask); - Assert.isTrue(1 == i, new EasyRetryServerException("同步重试数据失败", JsonUtil.toJsonString(retryTask))); + Assert.isTrue(1 == i, () -> new EasyRetryServerException("同步重试数据失败", JsonUtil.toJsonString(retryTask))); return i; } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/processor/RetryTaskAccessProcessor.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/processor/RetryTaskAccessProcessor.java index 9be2108ff..8b4c5f616 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/processor/RetryTaskAccessProcessor.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/persistence/support/processor/RetryTaskAccessProcessor.java @@ -49,7 +49,7 @@ public class RetryTaskAccessProcessor implements RetryTaskAccess { @Override public int updateRetryTask(RetryTask retryTask) { Assert.isTrue(1 == retryTaskAccesses.updateRetryTask(retryTask), - new EasyRetryServerException("更新重试任务失败")); + () -> new EasyRetryServerException("更新重试任务失败")); return 1; } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/RetryTaskService.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/RetryTaskService.java index 438ca0cff..fb792bbc4 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/RetryTaskService.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/RetryTaskService.java @@ -1,10 +1,11 @@ package com.aizuda.easy.retry.server.service; -import com.aizuda.easy.retry.client.model.GenerateRetryBizIdDTO; import com.aizuda.easy.retry.server.web.model.base.PageResult; +import com.aizuda.easy.retry.server.web.model.request.GenerateRetryBizIdVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO; -import com.aizuda.easy.retry.server.web.model.request.RetryTaskRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateStatusRequestVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskSaveRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateExecutorNameRequestVO; import com.aizuda.easy.retry.server.web.model.response.RetryTaskResponseVO; import java.util.List; @@ -18,9 +19,22 @@ public interface RetryTaskService { PageResult> getRetryTaskPage(RetryTaskQueryVO queryVO); + /** + * 通过重试任务表id获取重试任务信息 + * + * @param groupName 组名称 + * @param id 重试任务表id + * @return 重试任务 + */ RetryTaskResponseVO getRetryTaskById(String groupName, Long id); - int updateRetryTaskStatus(RetryTaskRequestVO retryTaskRequestVO); + /** + * 更新重试任务状态 + * + * @param retryTaskUpdateStatusRequestVO 更新重试任务状态请求模型 + * @return + */ + int updateRetryTaskStatus(RetryTaskUpdateStatusRequestVO retryTaskUpdateStatusRequestVO); /** * 手动新增重试任务 @@ -33,8 +47,16 @@ public interface RetryTaskService { /** * 委托客户端生成bizId * - * @param generateRetryBizIdDTO + * @param generateRetryBizIdVO 生成bizId请求模型 * @return */ - String bizIdGenerate(GenerateRetryBizIdDTO generateRetryBizIdDTO); + String bizIdGenerate(GenerateRetryBizIdVO generateRetryBizIdVO); + + /** + * 若客户端在变更了执行器,从而会导致执行重试任务时找不到执行器类,因此使用者可以在后端进行执行变更 + * + * @param requestVO 更新执行器变更模型 + * @return 更新条数 + */ + int updateRetryTaskExecutorName(RetryTaskUpdateExecutorNameRequestVO requestVO); } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/GroupConfigServiceImpl.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/GroupConfigServiceImpl.java index 2496abb57..b8fc59f37 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/GroupConfigServiceImpl.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/GroupConfigServiceImpl.java @@ -69,7 +69,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { Assert.isTrue(groupConfigMapper.selectCount(new LambdaQueryWrapper() .eq(GroupConfig::getGroupName, groupConfigRequestVO.getGroupName())) == 0, - new EasyRetryServerException("GroupName已经存在 {}", groupConfigRequestVO.getGroupName())); + () -> new EasyRetryServerException("GroupName已经存在 {}", groupConfigRequestVO.getGroupName())); doSaveGroupConfig(groupConfigRequestVO); @@ -96,7 +96,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { Assert.isTrue(1 == groupConfigMapper.update(groupConfig, new LambdaUpdateWrapper().eq(GroupConfig::getGroupName, groupConfigRequestVO.getGroupName())), - new EasyRetryServerException("新增组异常异常 groupConfigVO[{}]", groupConfigRequestVO)); + () -> new EasyRetryServerException("新增组异常异常 groupConfigVO[{}]", groupConfigRequestVO)); doUpdateNotifyConfig(groupConfigRequestVO); @@ -149,7 +149,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { groupConfig.setGroupPartition(HashUtil.bkdrHash(groupConfigRequestVO.getGroupName()) % totalPartition); } - Assert.isTrue(1 == groupConfigMapper.insert(groupConfig), new EasyRetryServerException("新增组异常异常 groupConfigVO[{}]", groupConfigRequestVO)); + Assert.isTrue(1 == groupConfigMapper.insert(groupConfig), () -> new EasyRetryServerException("新增组异常异常 groupConfigVO[{}]", groupConfigRequestVO)); } @Override @@ -182,7 +182,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { notifyConfig.setCreateDt(LocalDateTime.now()); Assert.isTrue(1 == notifyConfigMapper.insert(notifyConfig), - new EasyRetryServerException("插入通知配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(notifyConfig))); + () -> new EasyRetryServerException("插入通知配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(notifyConfig))); } private void doSaveSceneConfig(List sceneList, String groupName) { @@ -195,7 +195,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { sceneConfig.setGroupName(groupName); Assert.isTrue(1 == sceneConfigMapper.insert(sceneConfig), - new EasyRetryServerException("插入场景配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(sceneConfig))); + () -> new EasyRetryServerException("插入场景配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(sceneConfig))); } } } @@ -218,7 +218,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { } else if (sceneConfigVO.getIsDeleted() == 1) { Assert.isTrue( 1 == sceneConfigMapper.deleteById(oldSceneConfig.getId()), - new EasyRetryServerException("删除场景失败 [{}]", sceneConfigVO.getSceneName())); + () -> new EasyRetryServerException("删除场景失败 [{}]", sceneConfigVO.getSceneName())); } else { SceneConfig sceneConfig = sceneConfigConverter.convert(sceneConfigVO); sceneConfig.setGroupName(groupConfigRequestVO.getGroupName()); @@ -227,7 +227,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { new LambdaQueryWrapper() .eq(SceneConfig::getGroupName, sceneConfig.getGroupName()) .eq(SceneConfig::getSceneName, sceneConfig.getSceneName())), - new EasyRetryServerException("插入场景配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(sceneConfig))); + () -> new EasyRetryServerException("插入场景配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(sceneConfig))); } iterator.remove(); @@ -253,7 +253,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { } else if (Objects.nonNull(notifyConfigVO.getId()) && notifyConfigVO.getIsDeleted() == 1) { // delete Assert.isTrue(1 == notifyConfigMapper.deleteById(notifyConfigVO.getId()), - new EasyRetryServerException("删除通知配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(notifyConfigVO))); + () -> new EasyRetryServerException("删除通知配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(notifyConfigVO))); } else { // update Assert.isTrue(1 == notifyConfigMapper.update(notifyConfig, @@ -261,7 +261,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { .eq(NotifyConfig::getId, notifyConfigVO.getId()) .eq(NotifyConfig::getGroupName, notifyConfig.getGroupName()) .eq(NotifyConfig::getNotifyScene, notifyConfig.getNotifyScene())), - new EasyRetryServerException("更新通知配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(notifyConfig))); + () -> new EasyRetryServerException("更新通知配置失败 sceneConfig:[{}]", JsonUtil.toJsonString(notifyConfig))); } } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryDeadLetterServiceImpl.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryDeadLetterServiceImpl.java index 405d5a21e..dd9b3bebc 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryDeadLetterServiceImpl.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryDeadLetterServiceImpl.java @@ -92,10 +92,10 @@ public class RetryDeadLetterServiceImpl implements RetryDeadLetterService { retryTask.setCreateDt(LocalDateTime.now()); retryTask.setUpdateDt(LocalDateTime.now()); RequestDataHelper.setPartition(groupName); - Assert.isTrue(1 == retryTaskMapper.insert(retryTask), new EasyRetryServerException("新增重试任务失败")); + Assert.isTrue(1 == retryTaskMapper.insert(retryTask), () -> new EasyRetryServerException("新增重试任务失败")); RequestDataHelper.setPartition(groupName); - Assert.isTrue(1 == retryDeadLetterMapper.deleteById(retryDeadLetter.getId()), new EasyRetryServerException("删除死信队列数据失败")); + Assert.isTrue(1 == retryDeadLetterMapper.deleteById(retryDeadLetter.getId()), () -> new EasyRetryServerException("删除死信队列数据失败")); return true; } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryServiceImpl.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryServiceImpl.java index f30332ba3..ef0da319f 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryServiceImpl.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryServiceImpl.java @@ -91,7 +91,7 @@ public class RetryServiceImpl implements RetryService { retryTask.setNextTriggerAt(WaitStrategies.randomWait(1, TimeUnit.SECONDS, 60, TimeUnit.SECONDS).computeRetryTime(null)); - Assert.isTrue(1 == retryTaskAccess.saveRetryTask(retryTask), new EasyRetryServerException("上报数据失败")); + Assert.isTrue(1 == retryTaskAccess.saveRetryTask(retryTask), () -> new EasyRetryServerException("上报数据失败")); return Boolean.TRUE; } @@ -140,11 +140,11 @@ public class RetryServiceImpl implements RetryService { GroupConfig groupConfig = configAccess.getGroupConfigByGroupName(groupName); Assert.isTrue(retryDeadLetters.size() == retryDeadLetterMapper.insertBatch(retryDeadLetters, groupConfig.getGroupPartition()), - new EasyRetryServerException("插入死信队列失败 [{}]" , JsonUtil.toJsonString(retryDeadLetters))); + () -> new EasyRetryServerException("插入死信队列失败 [{}]" , JsonUtil.toJsonString(retryDeadLetters))); List ids = retryTasks.stream().map(RetryTask::getId).collect(Collectors.toList()); Assert.isTrue(retryTasks.size() == retryTaskMapper.deleteBatch(ids, groupConfig.getGroupPartition()), - new EasyRetryServerException("删除重试数据失败 [{}]", JsonUtil.toJsonString(retryTasks))); + () -> new EasyRetryServerException("删除重试数据失败 [{}]", JsonUtil.toJsonString(retryTasks))); } /** diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryTaskServiceImpl.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryTaskServiceImpl.java index 6b9ad26c9..2c2ed0ee2 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryTaskServiceImpl.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/RetryTaskServiceImpl.java @@ -1,30 +1,34 @@ package com.aizuda.easy.retry.server.service.impl; import com.aizuda.easy.retry.client.model.GenerateRetryBizIdDTO; +import com.aizuda.easy.retry.common.core.enums.RetryStatusEnum; import com.aizuda.easy.retry.common.core.model.Result; import com.aizuda.easy.retry.common.core.util.Assert; +import com.aizuda.easy.retry.server.config.RequestDataHelper; import com.aizuda.easy.retry.server.exception.EasyRetryServerException; import com.aizuda.easy.retry.server.persistence.mybatis.mapper.RetryTaskMapper; import com.aizuda.easy.retry.server.persistence.mybatis.po.RetryTask; import com.aizuda.easy.retry.server.persistence.mybatis.po.ServerNode; +import com.aizuda.easy.retry.server.service.RetryTaskService; import com.aizuda.easy.retry.server.service.convert.RetryTaskConverter; +import com.aizuda.easy.retry.server.service.convert.RetryTaskResponseVOConverter; import com.aizuda.easy.retry.server.support.handler.ClientNodeAllocateHandler; import com.aizuda.easy.retry.server.support.strategy.WaitStrategies; -import com.aizuda.easy.retry.server.web.model.request.RetryTaskSaveRequestVO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; -import com.aizuda.easy.retry.common.core.enums.RetryStatusEnum; -import com.aizuda.easy.retry.server.config.RequestDataHelper; import com.aizuda.easy.retry.server.web.model.base.PageResult; -import com.aizuda.easy.retry.server.service.RetryTaskService; -import com.aizuda.easy.retry.server.service.convert.RetryTaskResponseVOConverter; +import com.aizuda.easy.retry.server.web.model.request.GenerateRetryBizIdVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO; -import com.aizuda.easy.retry.server.web.model.request.RetryTaskRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateStatusRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskSaveRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateExecutorNameRequestVO; import com.aizuda.easy.retry.server.web.model.response.RetryTaskResponseVO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import java.text.MessageFormat; @@ -82,8 +86,8 @@ public class RetryTaskServiceImpl implements RetryTaskService { RequestDataHelper.setPartition(queryVO.getGroupName()); retryTaskLambdaQueryWrapper.select(RetryTask::getId, RetryTask::getBizNo, RetryTask::getBizId, - RetryTask::getGroupName, RetryTask::getNextTriggerAt, RetryTask::getRetryCount, - RetryTask::getRetryStatus, RetryTask::getUpdateDt, RetryTask::getSceneName); + RetryTask::getGroupName, RetryTask::getNextTriggerAt, RetryTask::getRetryCount, + RetryTask::getRetryStatus, RetryTask::getUpdateDt, RetryTask::getSceneName); pageDTO = retryTaskMapper.selectPage(pageDTO, retryTaskLambdaQueryWrapper.orderByDesc(RetryTask::getCreateDt)); return new PageResult<>(pageDTO, retryTaskResponseVOConverter.batchConvert(pageDTO.getRecords())); } @@ -96,28 +100,29 @@ public class RetryTaskServiceImpl implements RetryTaskService { } @Override - public int updateRetryTaskStatus(RetryTaskRequestVO retryTaskRequestVO) { + public int updateRetryTaskStatus(RetryTaskUpdateStatusRequestVO retryTaskUpdateStatusRequestVO) { - RetryStatusEnum retryStatusEnum = RetryStatusEnum.getByStatus(retryTaskRequestVO.getRetryStatus()); + RetryStatusEnum retryStatusEnum = RetryStatusEnum.getByStatus(retryTaskUpdateStatusRequestVO.getRetryStatus()); if (Objects.isNull(retryStatusEnum)) { throw new EasyRetryServerException("重试状态错误"); } - RequestDataHelper.setPartition(retryTaskRequestVO.getGroupName()); - RetryTask retryTask = retryTaskMapper.selectById(retryTaskRequestVO.getId()); + RequestDataHelper.setPartition(retryTaskUpdateStatusRequestVO.getGroupName()); + RetryTask retryTask = retryTaskMapper.selectById(retryTaskUpdateStatusRequestVO.getId()); if (Objects.isNull(retryTask)) { throw new EasyRetryServerException("未查询到重试任务"); } - retryTask.setRetryStatus(retryTaskRequestVO.getRetryStatus()); - retryTask.setGroupName(retryTaskRequestVO.getGroupName()); + retryTask.setRetryStatus(retryTaskUpdateStatusRequestVO.getRetryStatus()); + retryTask.setGroupName(retryTaskUpdateStatusRequestVO.getGroupName()); // 若恢复重试则需要重新计算下次触发时间 if (RetryStatusEnum.RUNNING.getStatus().equals(retryStatusEnum.getStatus())) { - retryTask.setNextTriggerAt(WaitStrategies.randomWait(1, TimeUnit.SECONDS, 60, TimeUnit.SECONDS).computeRetryTime(null)); + retryTask.setNextTriggerAt( + WaitStrategies.randomWait(1, TimeUnit.SECONDS, 60, TimeUnit.SECONDS).computeRetryTime(null)); } - RequestDataHelper.setPartition(retryTaskRequestVO.getGroupName()); + RequestDataHelper.setPartition(retryTaskUpdateStatusRequestVO.getGroupName()); return retryTaskMapper.updateById(retryTask); } @@ -136,21 +141,57 @@ public class RetryTaskServiceImpl implements RetryTaskService { retryTask.setExtAttrs(StringUtils.EMPTY); } - retryTask.setNextTriggerAt(WaitStrategies.randomWait(1, TimeUnit.SECONDS, 60, TimeUnit.SECONDS).computeRetryTime(null)); + retryTask.setNextTriggerAt( + WaitStrategies.randomWait(1, TimeUnit.SECONDS, 60, TimeUnit.SECONDS).computeRetryTime(null)); + RequestDataHelper.setPartition(retryTaskRequestVO.getGroupName()); return retryTaskMapper.insert(retryTask); } @Override - public String bizIdGenerate(final GenerateRetryBizIdDTO generateRetryBizIdDTO) { - ServerNode serverNode = clientNodeAllocateHandler.getServerNode(generateRetryBizIdDTO.getGroup()); + public String bizIdGenerate(final GenerateRetryBizIdVO generateRetryBizIdVO) { + ServerNode serverNode = clientNodeAllocateHandler.getServerNode(generateRetryBizIdVO.getGroupName()); Assert.notNull(serverNode, () -> new EasyRetryServerException("生成bizId失败: 不存在活跃的客户端节点")); // 委托客户端生成bizId String url = MessageFormat .format(URL, serverNode.getHostIp(), serverNode.getHostPort().toString(), serverNode.getContextPath()); + + GenerateRetryBizIdDTO generateRetryBizIdDTO = new GenerateRetryBizIdDTO(); + generateRetryBizIdDTO.setGroup(generateRetryBizIdVO.getGroupName()); + generateRetryBizIdDTO.setScene(generateRetryBizIdVO.getSceneName()); + generateRetryBizIdDTO.setArgsStr(generateRetryBizIdVO.getArgsStr()); + generateRetryBizIdDTO.setExecutorName(generateRetryBizIdVO.getExecutorName()); + HttpEntity requestEntity = new HttpEntity<>(generateRetryBizIdDTO); Result result = restTemplate.postForObject(url, requestEntity, Result.class); + + Assert.notNull(result, () -> new EasyRetryServerException("biz生成失败")); + Assert.isTrue(1 == result.getStatus(), () -> new EasyRetryServerException("biz生成失败:请确保参数与执行器名称正确")); + return result.getData(); } + + @Override + public int updateRetryTaskExecutorName(final RetryTaskUpdateExecutorNameRequestVO requestVO) { + + RetryTask retryTask = new RetryTask(); + retryTask.setExecutorName(requestVO.getExecutorName()); + retryTask.setUpdateDt(LocalDateTime.now()); + if (!CollectionUtils.isEmpty(requestVO.getIds())) { + + // 根据重试数据id,更新执行器名称 + RequestDataHelper.setPartition(requestVO.getGroupName()); + return retryTaskMapper + .update(retryTask, new LambdaUpdateWrapper().in(RetryTask::getId, requestVO.getIds())); + } + + // 更新组下面的场景对应的执行器名称 + RequestDataHelper.setPartition(requestVO.getGroupName()); + return retryTaskMapper + .update(retryTask, new LambdaUpdateWrapper() + .eq(RetryTask::getGroupName, requestVO.getGroupName()) + .eq(RetryTask::getSceneName, requestVO.getSceneName()) + ); + } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/SystemUserServiceImpl.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/SystemUserServiceImpl.java index 386d11d7d..72603f976 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/SystemUserServiceImpl.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/service/impl/SystemUserServiceImpl.java @@ -109,7 +109,7 @@ public class SystemUserServiceImpl implements SystemUserService { systemUser.setPassword(SecureUtil.sha256(requestVO.getPassword())); systemUser.setRole(requestVO.getRole()); - Assert.isTrue(1 == systemUserMapper.insert(systemUser), new EasyRetryServerException("新增用户失败")); + Assert.isTrue(1 == systemUserMapper.insert(systemUser), () -> new EasyRetryServerException("新增用户失败")); // 只添加为普通用户添加权限 List groupNameList = requestVO.getGroupNameList(); @@ -121,7 +121,7 @@ public class SystemUserServiceImpl implements SystemUserService { SystemUserPermission systemUserPermission = new SystemUserPermission(); systemUserPermission.setSystemUserId(systemUser.getId()); systemUserPermission.setGroupName(groupName); - Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission), new EasyRetryServerException("新增用户权限失败")); + Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission), () -> new EasyRetryServerException("新增用户权限失败")); } } @@ -148,7 +148,7 @@ public class SystemUserServiceImpl implements SystemUserService { systemUser.setRole(requestVO.getRole()); - Assert.isTrue(1 == systemUserMapper.updateById(systemUser), new EasyRetryServerException("更新用户失败")); + Assert.isTrue(1 == systemUserMapper.updateById(systemUser), () -> new EasyRetryServerException("更新用户失败")); // 只添加为普通用户添加权限 List groupNameList = requestVO.getGroupNameList(); @@ -163,7 +163,7 @@ public class SystemUserServiceImpl implements SystemUserService { SystemUserPermission systemUserPermission = new SystemUserPermission(); systemUserPermission.setSystemUserId(systemUser.getId()); systemUserPermission.setGroupName(groupName); - Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission), new EasyRetryServerException("更新用户权限失败")); + Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission), () -> new EasyRetryServerException("更新用户权限失败")); } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/exec/ExecUnitActor.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/exec/ExecUnitActor.java index bf882f74c..4fb8304b5 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/exec/ExecUnitActor.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/exec/ExecUnitActor.java @@ -91,7 +91,7 @@ public class ExecUnitActor extends AbstractActor { retryTaskLog.setCreateDt(LocalDateTime.now()); retryTaskLog.setId(null); Assert.isTrue(1 == retryTaskLogMapper.insert(retryTaskLog), - new EasyRetryServerException("新增重试日志失败")); + () -> new EasyRetryServerException("新增重试日志失败")); } }).build(); diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FailureActor.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FailureActor.java index d54e52822..c417a0045 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FailureActor.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FailureActor.java @@ -91,7 +91,7 @@ public class FailureActor extends AbstractActor { RetryTaskLog retryTaskLog = records.get(0); retryTaskLog.setRetryStatus(retryTask.getRetryStatus()); Assert.isTrue(1 == retryTaskLogMapper.updateById(retryTaskLog), - new EasyRetryServerException("更新重试日志失败")); + () -> new EasyRetryServerException("更新重试日志失败")); } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FinishActor.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FinishActor.java index ee12f13df..4e4af6055 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FinishActor.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/support/dispatch/actor/result/FinishActor.java @@ -76,7 +76,7 @@ public class FinishActor extends AbstractActor { RetryTaskLog retryTaskLog = records.get(0); retryTaskLog.setRetryStatus(retryTask.getRetryStatus()); Assert.isTrue(1 == retryTaskLogMapper.updateById(retryTaskLog), - new EasyRetryServerException("更新重试日志失败")); + () -> new EasyRetryServerException("更新重试日志失败")); } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/controller/RetryTaskController.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/controller/RetryTaskController.java index 2f4d87a31..9d2164f34 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/controller/RetryTaskController.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/controller/RetryTaskController.java @@ -1,12 +1,13 @@ package com.aizuda.easy.retry.server.web.controller; -import com.aizuda.easy.retry.client.model.GenerateRetryBizIdDTO; import com.aizuda.easy.retry.server.service.RetryTaskService; 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.GenerateRetryBizIdVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO; -import com.aizuda.easy.retry.server.web.model.request.RetryTaskRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateStatusRequestVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskSaveRequestVO; +import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateExecutorNameRequestVO; import com.aizuda.easy.retry.server.web.model.response.RetryTaskResponseVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -49,8 +50,8 @@ public class RetryTaskController { @LoginRequired @PutMapping("status") - public int updateRetryTaskStatus(@RequestBody RetryTaskRequestVO retryTaskRequestVO) { - return retryTaskService.updateRetryTaskStatus(retryTaskRequestVO); + public int updateRetryTaskStatus(@RequestBody RetryTaskUpdateStatusRequestVO retryTaskUpdateStatusRequestVO) { + return retryTaskService.updateRetryTaskStatus(retryTaskUpdateStatusRequestVO); } @LoginRequired @@ -61,8 +62,13 @@ public class RetryTaskController { @LoginRequired @PostMapping("/generate/biz-id") - public String bizIdGenerate(@RequestBody @Validated GenerateRetryBizIdDTO generateRetryBizIdDTO) { - return retryTaskService.bizIdGenerate(generateRetryBizIdDTO); + public String bizIdGenerate(@RequestBody @Validated GenerateRetryBizIdVO generateRetryBizIdVO) { + return retryTaskService.bizIdGenerate(generateRetryBizIdVO); } + @LoginRequired + @PutMapping("/executor-name/batch") + public Integer updateRetryTaskExecutorName(@RequestBody @Validated RetryTaskUpdateExecutorNameRequestVO requestVO) { + return retryTaskService.updateRetryTaskExecutorName(requestVO); + } } diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskSaveRequestVO.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskSaveRequestVO.java index d3913ceba..3be9dd832 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskSaveRequestVO.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskSaveRequestVO.java @@ -28,9 +28,9 @@ public class RetryTaskSaveRequestVO { private String sceneName; /** - * 重试ID(同一个场景下正在重试中的bizId不能重复) + * 业务id(同一个场景下正在重试中的bizId不能重复) */ - @NotBlank(message = "重试ID不能为空") + @NotBlank(message = "业务id不能为空") private String bizId; /** diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateExecutorNameRequestVO.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateExecutorNameRequestVO.java new file mode 100644 index 000000000..64b482d53 --- /dev/null +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateExecutorNameRequestVO.java @@ -0,0 +1,34 @@ +package com.aizuda.easy.retry.server.web.model.request; + +import lombok.Data; +import org.hibernate.validator.constraints.NotBlank; + +import java.util.List; + +/** + * 更新执行器名称 + * + * @author www.byteblogs.com + * @date 2022-09-29 + */ +@Data +public class RetryTaskUpdateExecutorNameRequestVO { + + /** + * 组名称 + */ + @NotBlank(message = "groupName 不能为空") + private String groupName; + + @NotBlank(message = "scene 不能为空") + private String sceneName; + + @NotBlank(message = "executorName 不能为空") + private String executorName; + + /** + * 重试表id + */ + private List ids; + +} diff --git a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskRequestVO.java b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateStatusRequestVO.java similarity index 60% rename from easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskRequestVO.java rename to easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateStatusRequestVO.java index cdfc70941..43f83ef8c 100644 --- a/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskRequestVO.java +++ b/easy-retry-server/src/main/java/com/aizuda/easy/retry/server/web/model/request/RetryTaskUpdateStatusRequestVO.java @@ -3,27 +3,33 @@ package com.aizuda.easy.retry.server.web.model.request; import com.aizuda.easy.retry.common.core.enums.RetryStatusEnum; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** + * 更新重试任务模型 + * * @author www.byteblogs.com * @date 2022-09-29 - * @since 2.0 */ @Data -public class RetryTaskRequestVO { +public class RetryTaskUpdateStatusRequestVO { /** * 重试状态 {@link RetryStatusEnum} */ + @NotBlank(message = "重试状态 不能为空") private Integer retryStatus; /** * 组名称 */ + @NotBlank(message = "组名称 不能为空") private String groupName; /** * 重试表id */ + @NotBlank(message = "重试表id 不能为空") private Long id; } diff --git a/example/src/main/java/com/example/demo/TestEventListener.java b/example/src/main/java/com/example/demo/TestEventListener.java index a05fc79ab..c70da0cf4 100644 --- a/example/src/main/java/com/example/demo/TestEventListener.java +++ b/example/src/main/java/com/example/demo/TestEventListener.java @@ -7,7 +7,7 @@ import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; /** - * @author: shuguang.zhang + * @author: www.byteblogs.com * @date : 2023-04-25 22:46 */ @Component