feat: 1.2.0

1. bizId变更为idempotent_id
This commit is contained in:
byteblogs168 2023-05-04 18:46:34 +08:00
parent c0614538d4
commit aa4394ff0d
48 changed files with 187 additions and 2496 deletions

View File

@ -35,7 +35,7 @@ CREATE TABLE `retry_dead_letter_0`
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`group_name` varchar(64) NOT NULL COMMENT '组名称', `group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景id', `scene_name` varchar(64) NOT NULL COMMENT '场景id',
`biz_id` varchar(64) NOT NULL COMMENT '业务id', `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id',
`biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号',
`executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称',
`args_str` text NOT NULL COMMENT '执行方法参数', `args_str` text NOT NULL COMMENT '执行方法参数',
@ -43,7 +43,7 @@ CREATE TABLE `retry_dead_letter_0`
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `idx_group_name_scene_name` (`group_name`, `scene_name`), KEY `idx_group_name_scene_name` (`group_name`, `scene_name`),
KEY `idx_biz_id` (`biz_id`), KEY `idx_idempotent_id` (`idempotent_id`),
KEY `idx_biz_no` (`biz_no`) KEY `idx_biz_no` (`biz_no`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='重试死信队列' ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='重试死信队列'
; ;
@ -53,7 +53,7 @@ CREATE TABLE `retry_task_0`
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`group_name` varchar(64) NOT NULL COMMENT '组名称', `group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称', `scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`biz_id` varchar(64) NOT NULL COMMENT '业务id', `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id',
`biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号',
`executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称',
`args_str` text NOT NULL COMMENT '执行方法参数', `args_str` text NOT NULL COMMENT '执行方法参数',
@ -66,7 +66,7 @@ CREATE TABLE `retry_task_0`
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `idx_group_name_scene_name` (`group_name`, `scene_name`), KEY `idx_group_name_scene_name` (`group_name`, `scene_name`),
KEY `idx_retry_status` (`retry_status`), KEY `idx_retry_status` (`retry_status`),
KEY `idx_biz_id` (`biz_id`) KEY `idx_idempotent_id` (`idempotent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='重试表' ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='重试表'
; ;
@ -75,7 +75,7 @@ CREATE TABLE `retry_task_log`
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`group_name` varchar(64) NOT NULL COMMENT '组名称', `group_name` varchar(64) NOT NULL COMMENT '组名称',
`scene_name` varchar(64) NOT NULL COMMENT '场景名称', `scene_name` varchar(64) NOT NULL COMMENT '场景名称',
`biz_id` varchar(64) NOT NULL COMMENT '业务id', `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id',
`biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号',
`executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称',
`args_str` text NOT NULL COMMENT '执行方法参数', `args_str` text NOT NULL COMMENT '执行方法参数',
@ -87,7 +87,7 @@ CREATE TABLE `retry_task_log`
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `idx_group_name_scene_name` (`group_name`, `scene_name`), KEY `idx_group_name_scene_name` (`group_name`, `scene_name`),
KEY `idx_retry_status` (`retry_status`), KEY `idx_retry_status` (`retry_status`),
KEY `idx_biz_id` (`biz_id`) KEY `idx_idempotent_id` (`idempotent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='重试日志表' ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='重试日志表'
; ;

View File

@ -1,33 +0,0 @@
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;
}

View File

@ -0,0 +1,33 @@
package com.aizuda.easy.retry.client.core;
/**
* 幂等id生成器
* 同一个组的同一个场景下只会存在一个相同的idempotentId重试任务, 若存在相同的则上报服务后会被幂等处理
* 比如:
* : AGroup
* 场景: BScene
* 时刻1: 上报一个异常 idempotentId: A1 状态为重试中
* 时刻2: 上报一个异常 idempotentId: A2 状态为重试中可以上报成功此时存在两个重试任务
* 时刻3: 上报一个异常 idempotentId: A1 不会新增一个重试任务会被幂等处理
* 时刻4: idempotentId: A1 重试完成, 状态为已完成
* 时刻5: 上报一个异常 idempotentId: A1 状态为重试中, 新增一条重试任务
*
* @author: www.byteblogs.com
* @date : 2022-03-08 09:42
*/
public interface IdempotentIdGenerate {
/**
* 参数列表为Object一维数组, 下面说明每一个下标代表的数据含义
* 0: 场景名称: scene(String)
* 1: 执行器名称: targetClassName(String)
* 2: 参数列表: args(Object[])
* 3: 执行的方法名称: methodName(String)
* scene, targetClassName, args, executorMethod.getName()
*
* @param t 参数列表
* @return idempotentId
* @throws Exception
*/
String idGenerate(Object... t) throws Exception;
}

View File

@ -1,8 +1,8 @@
package com.aizuda.easy.retry.client.core.annotation; package com.aizuda.easy.retry.client.core.annotation;
import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.generator.SimpleBizIdGenerate; import com.aizuda.easy.retry.client.core.generator.SimpleIdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.strategy.RetryAnnotationMethod; import com.aizuda.easy.retry.client.core.strategy.RetryAnnotationMethod;
import com.aizuda.easy.retry.client.core.callback.RetryCompleteCallback; import com.aizuda.easy.retry.client.core.callback.RetryCompleteCallback;
import com.aizuda.easy.retry.client.core.callback.SimpleRetryCompleteCallback; import com.aizuda.easy.retry.client.core.callback.SimpleRetryCompleteCallback;
@ -49,22 +49,22 @@ public @interface Retryable {
Class<? extends RetryMethod> retryMethod() default RetryAnnotationMethod.class; Class<? extends RetryMethod> retryMethod() default RetryAnnotationMethod.class;
/** /**
* 业务id生成器 * 幂等id生成器
* 同一个组的同一个场景下只会存在一个相同的bizId并且状态为'重试中'的任务, 若存在相同的则上报服务后会被幂等处理 * 同一个组的同一个场景下只会存在一个相同的idempotentId并且状态为'重试中'的任务, 若存在相同的则上报服务后会被幂等处理
* 比如: * 比如:
* : AGroup * : AGroup
* 场景: BScene * 场景: BScene
* 时刻1: 上报一个异常 bizId: A1 状态为重试中 * 时刻1: 上报一个异常 idempotentId: A1 状态为重试中
* 时刻2: 上报一个异常 bizId: A2 状态为重试中可以上报成功此时存在两个重试任务 * 时刻2: 上报一个异常 idempotentId: A2 状态为重试中可以上报成功此时存在两个重试任务
* 时刻3: 上报一个异常 bizId: A1 不会新增一个重试任务会被幂等处理 * 时刻3: 上报一个异常 idempotentId: A1 不会新增一个重试任务会被幂等处理
* 时刻4: bizId: A1 重试完成, 状态为已完成 * 时刻4: idempotentId: A1 重试完成, 状态为已完成
* 时刻5: 上报一个异常 bizId: A1 状态为重试中, 新增一条重试任务 * 时刻5: 上报一个异常 idempotentId: A1 状态为重试中, 新增一条重试任务
** **
* 默认的bizId生成器{@link SimpleBizIdGenerate} 对所有参数进行MD5 * 默认的idempotentId生成器{@link SimpleIdempotentIdGenerate} 对所有参数进行MD5
* *
* @return bizId * @return idempotentId
*/ */
Class<? extends BizIdGenerate> bizId() default SimpleBizIdGenerate.class; Class<? extends IdempotentIdGenerate> idempotentId() default SimpleIdempotentIdGenerate.class;
/** /**
* 服务端重试完成(重试成功重试到达最大次数)回调客户端 * 服务端重试完成(重试成功重试到达最大次数)回调客户端

View File

@ -1,7 +1,7 @@
package com.aizuda.easy.retry.client.core.client; package com.aizuda.easy.retry.client.core.client;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.RetryArgSerializer; import com.aizuda.easy.retry.client.core.RetryArgSerializer;
import com.aizuda.easy.retry.client.core.cache.GroupVersionCache; import com.aizuda.easy.retry.client.core.cache.GroupVersionCache;
import com.aizuda.easy.retry.client.core.cache.RetryerInfoCache; import com.aizuda.easy.retry.client.core.cache.RetryerInfoCache;
@ -12,7 +12,7 @@ import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.retryer.RetryerResultContext; import com.aizuda.easy.retry.client.core.retryer.RetryerResultContext;
import com.aizuda.easy.retry.client.core.serializer.JacksonSerializer; import com.aizuda.easy.retry.client.core.serializer.JacksonSerializer;
import com.aizuda.easy.retry.client.core.strategy.RetryStrategy; import com.aizuda.easy.retry.client.core.strategy.RetryStrategy;
import com.aizuda.easy.retry.client.model.GenerateRetryBizIdDTO; import com.aizuda.easy.retry.client.model.GenerateRetryIdempotentIdDTO;
import com.aizuda.easy.retry.common.core.context.SpringContext; import com.aizuda.easy.retry.common.core.context.SpringContext;
import com.aizuda.easy.retry.common.core.enums.RetryResultStatusEnum; 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.enums.RetryStatusEnum;
@ -87,7 +87,7 @@ public class RetryEndPoint {
executeRespDto.setExceptionMsg(retryerResultContext.getMessage()); executeRespDto.setExceptionMsg(retryerResultContext.getMessage());
} }
executeRespDto.setBizId(executeReqDto.getBizId()); executeRespDto.setIdempotentId(executeReqDto.getIdempotentId());
if (Objects.nonNull(retryerResultContext.getResult())) { if (Objects.nonNull(retryerResultContext.getResult())) {
executeRespDto.setResultJson(JsonUtil.toJsonString(retryerResultContext.getResult())); executeRespDto.setResultJson(JsonUtil.toJsonString(retryerResultContext.getResult()));
} }
@ -140,17 +140,17 @@ public class RetryEndPoint {
} }
/** /**
* 手动新增重试数据模拟生成bizId * 手动新增重试数据模拟生成idempotentId
* *
* @param generateRetryBizIdDTO 生成bizId模型 * @param generateRetryIdempotentIdDTO 生成idempotentId模型
* @return bizId * @return idempotentId
*/ */
@PostMapping("/generate/biz-id/v1") @PostMapping("/generate/idempotent-id/v1")
public Result<String> bizIdGenerate(@RequestBody @Validated GenerateRetryBizIdDTO generateRetryBizIdDTO) { public Result<String> idempotentIdGenerate(@RequestBody @Validated GenerateRetryIdempotentIdDTO generateRetryIdempotentIdDTO) {
String scene = generateRetryBizIdDTO.getScene(); String scene = generateRetryIdempotentIdDTO.getScene();
String executorName = generateRetryBizIdDTO.getExecutorName(); String executorName = generateRetryIdempotentIdDTO.getExecutorName();
String argsStr = generateRetryBizIdDTO.getArgsStr(); String argsStr = generateRetryIdempotentIdDTO.getArgsStr();
RetryerInfo retryerInfo = RetryerInfoCache.get(scene, executorName); RetryerInfo retryerInfo = RetryerInfoCache.get(scene, executorName);
Assert.notNull(retryerInfo, ()-> new EasyRetryClientException("重试信息不存在 scene:[{}] executorName:[{}]", scene, executorName)); Assert.notNull(retryerInfo, ()-> new EasyRetryClientException("重试信息不存在 scene:[{}] executorName:[{}]", scene, executorName));
@ -166,18 +166,18 @@ public class RetryEndPoint {
throw new EasyRetryClientException("参数解析异常", e); throw new EasyRetryClientException("参数解析异常", e);
} }
String bizId; String idempotentId;
try { try {
Class<? extends BizIdGenerate> bizIdGenerate = retryerInfo.getBizIdGenerate(); Class<? extends IdempotentIdGenerate> idempotentIdGenerate = retryerInfo.getIdempotentIdGenerate();
BizIdGenerate generate = bizIdGenerate.newInstance(); IdempotentIdGenerate generate = idempotentIdGenerate.newInstance();
Method method = bizIdGenerate.getMethod("idGenerate", Object[].class); Method method = idempotentIdGenerate.getMethod("idGenerate", Object[].class);
Object p = new Object[]{scene, executorName, deSerialize, executorMethod.getName()}; Object p = new Object[]{scene, executorName, deSerialize, executorMethod.getName()};
bizId = (String) ReflectionUtils.invokeMethod(method, generate, p); idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, p);
} catch (Exception exception) { } catch (Exception exception) {
LogUtils.error(log, "自定义id生成异常{},{}", scene, argsStr, exception); LogUtils.error(log, "幂等id生成异常{},{}", scene, argsStr, exception);
throw new EasyRetryClientException("bizId生成异常{},{}", scene, argsStr); throw new EasyRetryClientException("idempotentId生成异常{},{}", scene, argsStr);
} }
return new Result<>(bizId); return new Result<>(idempotentId);
} }
} }

View File

@ -1,16 +1,16 @@
package com.aizuda.easy.retry.client.core.generator; package com.aizuda.easy.retry.client.core.generator;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.common.core.util.JsonUtil; import com.aizuda.easy.retry.common.core.util.JsonUtil;
/** /**
* 默认的bizId 生成器 * 默认的idempotentId 生成器
* *
* @author: www.byteblogs.com * @author: www.byteblogs.com
* @date : 2022-03-08 09:42 * @date : 2022-03-08 09:42
*/ */
public class SimpleBizIdGenerate implements BizIdGenerate { public class SimpleIdempotentIdGenerate implements IdempotentIdGenerate {
@Override @Override
public String idGenerate(Object... t) throws Exception { public String idGenerate(Object... t) throws Exception {

View File

@ -1,6 +1,6 @@
package com.aizuda.easy.retry.client.core.register.scan; package com.aizuda.easy.retry.client.core.register.scan;
import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.Scanner; import com.aizuda.easy.retry.client.core.Scanner;
import com.aizuda.easy.retry.client.core.annotation.Retryable; import com.aizuda.easy.retry.client.core.annotation.Retryable;
import com.aizuda.easy.retry.client.core.callback.RetryCompleteCallback; import com.aizuda.easy.retry.client.core.callback.RetryCompleteCallback;
@ -72,7 +72,7 @@ public class RetryableScanner implements Scanner, ApplicationContextAware {
Class executorNotProxy = AopUtils.getTargetClass(executor); Class executorNotProxy = AopUtils.getTargetClass(executor);
String executorClassName = executorNotProxy.getName(); String executorClassName = executorNotProxy.getName();
Class<? extends BizIdGenerate> bizIdGenerate = retryable.bizId(); Class<? extends IdempotentIdGenerate> idempotentIdGenerate = retryable.idempotentId();
String bizNo = retryable.bizNo(); String bizNo = retryable.bizNo();
RetryType retryType = retryable.retryStrategy(); RetryType retryType = retryable.retryStrategy();
int localTimes = retryable.localTimes(); int localTimes = retryable.localTimes();
@ -90,7 +90,7 @@ public class RetryableScanner implements Scanner, ApplicationContextAware {
retryType, retryType,
localTimes, localTimes,
localInterval, localInterval,
bizIdGenerate, idempotentIdGenerate,
bizNo, bizNo,
retryMethod, retryMethod,
throwException, throwException,

View File

@ -1,6 +1,6 @@
package com.aizuda.easy.retry.client.core.report; package com.aizuda.easy.retry.client.core.report;
import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.RetryArgSerializer; import com.aizuda.easy.retry.client.core.RetryArgSerializer;
import com.aizuda.easy.retry.client.core.config.EasyRetryProperties; import com.aizuda.easy.retry.client.core.config.EasyRetryProperties;
import com.aizuda.easy.retry.client.core.Lifecycle; import com.aizuda.easy.retry.client.core.Lifecycle;
@ -60,20 +60,20 @@ public class ReportHandler implements Lifecycle {
Method executorMethod = retryerInfo.getExecutorMethod(); Method executorMethod = retryerInfo.getExecutorMethod();
RetryTaskDTO retryTaskDTO = new RetryTaskDTO(); RetryTaskDTO retryTaskDTO = new RetryTaskDTO();
String bizId; String idempotentId;
try { try {
Class<? extends BizIdGenerate> bizIdGenerate = retryerInfo.getBizIdGenerate(); Class<? extends IdempotentIdGenerate> idempotentIdGenerate = retryerInfo.getIdempotentIdGenerate();
BizIdGenerate generate = bizIdGenerate.newInstance(); IdempotentIdGenerate generate = idempotentIdGenerate.newInstance();
Method method = bizIdGenerate.getMethod("idGenerate", Object[].class); Method method = idempotentIdGenerate.getMethod("idGenerate", Object[].class);
Object p = new Object[]{scene, targetClassName, args, executorMethod.getName()}; Object p = new Object[]{scene, targetClassName, args, executorMethod.getName()};
bizId = (String) ReflectionUtils.invokeMethod(method, generate, p); idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, p);
} catch (Exception exception) { } catch (Exception exception) {
LogUtils.error(log, "自定义id生成异常{},{}", scene, args, exception); LogUtils.error(log, "幂等id生成异常{},{}", scene, args, exception);
throw new EasyRetryClientException("bizId生成异常{},{}", scene, args); throw new EasyRetryClientException("idempotentId生成异常{},{}", scene, args);
} }
String serialize = retryArgSerializer.serialize(args); String serialize = retryArgSerializer.serialize(args);
retryTaskDTO.setBizId(bizId); retryTaskDTO.setIdempotentId(idempotentId);
retryTaskDTO.setExecutorName(targetClassName); retryTaskDTO.setExecutorName(targetClassName);
retryTaskDTO.setArgsStr(serialize); retryTaskDTO.setArgsStr(serialize);
retryTaskDTO.setGroupName(EasyRetryProperties.getGroup()); retryTaskDTO.setGroupName(EasyRetryProperties.getGroup());

View File

@ -1,6 +1,6 @@
package com.aizuda.easy.retry.client.core.retryer; package com.aizuda.easy.retry.client.core.retryer;
import com.aizuda.easy.retry.client.core.BizIdGenerate; import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.strategy.RetryMethod; import com.aizuda.easy.retry.client.core.strategy.RetryMethod;
import com.aizuda.easy.retry.client.core.callback.RetryCompleteCallback; import com.aizuda.easy.retry.client.core.callback.RetryCompleteCallback;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -26,7 +26,7 @@ public class RetryerInfo {
private final RetryType retryType; private final RetryType retryType;
private final Integer localTimes; private final Integer localTimes;
private final Integer localInterval; private final Integer localInterval;
private final Class<? extends BizIdGenerate> bizIdGenerate; private final Class<? extends IdempotentIdGenerate> idempotentIdGenerate;
private final String bizNo; private final String bizNo;
private final Class<? extends RetryMethod> retryMethod; private final Class<? extends RetryMethod> retryMethod;
private final boolean isThrowException; private final boolean isThrowException;

View File

@ -15,8 +15,8 @@ public class DispatchRetryDTO {
private String scene; private String scene;
@NotBlank(message = "参数 不能为空") @NotBlank(message = "参数 不能为空")
private String argsStr; private String argsStr;
@NotBlank(message = "bizId 不能为空") @NotBlank(message = "idempotentId 不能为空")
private String bizId; private String idempotentId;
@NotBlank(message = "executorName 不能为空") @NotBlank(message = "executorName 不能为空")
private String executorName; private String executorName;
} }

View File

@ -11,6 +11,6 @@ import lombok.Data;
public class DispatchRetryResultDTO { public class DispatchRetryResultDTO {
private String resultJson; private String resultJson;
private Integer statusCode; private Integer statusCode;
private String bizId; private String idempotentId;
private String exceptionMsg; private String exceptionMsg;
} }

View File

@ -4,13 +4,13 @@ import lombok.Data;
import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotBlank;
/** /**
* 生成bizId模型 * 生成idempotentId模型
* *
* @auther www.byteblogs.com * @auther www.byteblogs.com
* @date 2022/03/25 10:06 * @date 2022/03/25 10:06
*/ */
@Data @Data
public class GenerateRetryBizIdDTO { public class GenerateRetryIdempotentIdDTO {
@NotBlank(message = "group 不能为空") @NotBlank(message = "group 不能为空")
private String group; private String group;
@NotBlank(message = "scene 不能为空") @NotBlank(message = "scene 不能为空")

View File

@ -17,8 +17,8 @@ public class RetryCallbackDTO {
private String scene; private String scene;
@NotBlank(message = "参数 不能为空") @NotBlank(message = "参数 不能为空")
private String argsStr; private String argsStr;
@NotBlank(message = "bizId 不能为空") @NotBlank(message = "idempotentId 不能为空")
private String bizId; private String idempotentId;
@NotBlank(message = "executorName 不能为空") @NotBlank(message = "executorName 不能为空")
private String executorName; private String executorName;
@NotBlank(message = "retryStatus 不能为空") @NotBlank(message = "retryStatus 不能为空")

View File

@ -32,9 +32,9 @@ public class RetryTaskDTO implements Serializable {
/** /**
* 业务唯一id * 业务唯一id
*/ */
@NotBlank(message = "bizId 不能为空") @NotBlank(message = "idempotentId 不能为空")
@Length(max = 64, message = "业务唯一id最长为64") @Length(max = 64, message = "幂等id最长为64")
private String bizId; private String idempotentId;
/** /**
* 执行器名称 * 执行器名称

View File

@ -17,7 +17,7 @@ public class RetryDeadLetter implements Serializable {
private String sceneName; private String sceneName;
private String bizId; private String idempotentId;
private String bizNo; private String bizNo;

View File

@ -19,7 +19,7 @@ public class RetryTask implements Serializable {
private String sceneName; private String sceneName;
private String bizId; private String idempotentId;
private String bizNo; private String bizNo;
@ -41,4 +41,4 @@ public class RetryTask implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

View File

@ -17,7 +17,7 @@ public class RetryTaskLog implements Serializable {
private String sceneName; private String sceneName;
private String bizId; private String idempotentId;
private String bizNo; private String bizNo;

View File

@ -2,7 +2,7 @@ package com.aizuda.easy.retry.server.service;
import com.aizuda.easy.retry.server.web.model.base.PageResult; import com.aizuda.easy.retry.server.web.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.BatchDeleteRetryTaskVO; import com.aizuda.easy.retry.server.web.model.request.BatchDeleteRetryTaskVO;
import com.aizuda.easy.retry.server.web.model.request.GenerateRetryBizIdVO; import com.aizuda.easy.retry.server.web.model.request.GenerateRetryIdempotentIdVO;
import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO;
import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateStatusRequestVO; 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.RetryTaskSaveRequestVO;
@ -46,12 +46,12 @@ public interface RetryTaskService {
int saveRetryTask(RetryTaskSaveRequestVO retryTaskRequestVO); int saveRetryTask(RetryTaskSaveRequestVO retryTaskRequestVO);
/** /**
* 委托客户端生成bizId * 委托客户端生成idempotentId
* *
* @param generateRetryBizIdVO 生成bizId请求模型 * @param generateRetryIdempotentIdVO 生成idempotentId请求模型
* @return * @return
*/ */
String bizIdGenerate(GenerateRetryBizIdVO generateRetryBizIdVO); String idempotentIdGenerate(GenerateRetryIdempotentIdVO generateRetryIdempotentIdVO);
/** /**
* 若客户端在变更了执行器,从而会导致执行重试任务时找不到执行器类因此使用者可以在后端进行执行变更 * 若客户端在变更了执行器,从而会导致执行重试任务时找不到执行器类因此使用者可以在后端进行执行变更

View File

@ -61,8 +61,8 @@ public class RetryDeadLetterServiceImpl implements RetryDeadLetterService {
retryDeadLetterLambdaQueryWrapper.eq(RetryDeadLetter::getBizNo, queryVO.getBizNo()); retryDeadLetterLambdaQueryWrapper.eq(RetryDeadLetter::getBizNo, queryVO.getBizNo());
} }
if (StringUtils.isNotBlank(queryVO.getBizId())) { if (StringUtils.isNotBlank(queryVO.getIdempotentId())) {
retryDeadLetterLambdaQueryWrapper.eq(RetryDeadLetter::getBizId, queryVO.getBizId()); retryDeadLetterLambdaQueryWrapper.eq(RetryDeadLetter::getIdempotentId, queryVO.getIdempotentId());
} }
RequestDataHelper.setPartition(queryVO.getGroupName()); RequestDataHelper.setPartition(queryVO.getGroupName());

View File

@ -71,7 +71,7 @@ public class RetryServiceImpl implements RetryService {
RequestDataHelper.setPartition(retryTaskDTO.getGroupName()); RequestDataHelper.setPartition(retryTaskDTO.getGroupName());
// 此处做幂等处理避免客户端重复多次上报 // 此处做幂等处理避免客户端重复多次上报
long count = retryTaskMapper.selectCount(new LambdaQueryWrapper<RetryTask>() long count = retryTaskMapper.selectCount(new LambdaQueryWrapper<RetryTask>()
.eq(RetryTask::getBizId, retryTaskDTO.getBizId()) .eq(RetryTask::getIdempotentId, retryTaskDTO.getIdempotentId())
.eq(RetryTask::getGroupName, retryTaskDTO.getGroupName()) .eq(RetryTask::getGroupName, retryTaskDTO.getGroupName())
.eq(RetryTask::getSceneName, retryTaskDTO.getSceneName()) .eq(RetryTask::getSceneName, retryTaskDTO.getSceneName())
.eq(RetryTask::getRetryStatus, RetryStatusEnum.RUNNING.getStatus()) .eq(RetryTask::getRetryStatus, RetryStatusEnum.RUNNING.getStatus())

View File

@ -26,7 +26,7 @@ public class RetryTaskLogServiceImpl implements RetryTaskLogService {
private RetryTaskLogMapper retryTaskLogMapper; private RetryTaskLogMapper retryTaskLogMapper;
private RetryTaskLogResponseVOConverter retryTaskLogResponseVOConverter = new RetryTaskLogResponseVOConverter(); private RetryTaskLogResponseVOConverter retryTaskLogResponseVOConverter = new RetryTaskLogResponseVOConverter();
@Override @Override
public PageResult<List<RetryTaskLogResponseVO>> getRetryTaskLogPage(RetryTaskLogQueryVO queryVO) { public PageResult<List<RetryTaskLogResponseVO>> getRetryTaskLogPage(RetryTaskLogQueryVO queryVO) {
@ -42,12 +42,12 @@ public class RetryTaskLogServiceImpl implements RetryTaskLogService {
if (StringUtils.isNotBlank(queryVO.getBizNo())) { if (StringUtils.isNotBlank(queryVO.getBizNo())) {
retryTaskLogLambdaQueryWrapper.eq(RetryTaskLog::getBizNo, queryVO.getBizNo()); retryTaskLogLambdaQueryWrapper.eq(RetryTaskLog::getBizNo, queryVO.getBizNo());
} }
if (StringUtils.isNotBlank(queryVO.getBizId())) { if (StringUtils.isNotBlank(queryVO.getIdempotentId())) {
retryTaskLogLambdaQueryWrapper.eq(RetryTaskLog::getBizId, queryVO.getBizId()); retryTaskLogLambdaQueryWrapper.eq(RetryTaskLog::getIdempotentId, queryVO.getIdempotentId());
} }
retryTaskLogLambdaQueryWrapper.select(RetryTaskLog::getGroupName, RetryTaskLog::getId, RetryTaskLog::getSceneName, retryTaskLogLambdaQueryWrapper.select(RetryTaskLog::getGroupName, RetryTaskLog::getId, RetryTaskLog::getSceneName,
RetryTaskLog::getBizId, RetryTaskLog::getBizNo, RetryTaskLog::getErrorMessage, RetryTaskLog::getRetryStatus, RetryTaskLog::getCreateDt); RetryTaskLog::getIdempotentId, RetryTaskLog::getBizNo, RetryTaskLog::getErrorMessage, RetryTaskLog::getRetryStatus, RetryTaskLog::getCreateDt);
PageDTO<RetryTaskLog> retryTaskLogPageDTO = retryTaskLogMapper.selectPage(pageDTO, retryTaskLogLambdaQueryWrapper.orderByDesc(RetryTaskLog::getCreateDt)); PageDTO<RetryTaskLog> retryTaskLogPageDTO = retryTaskLogMapper.selectPage(pageDTO, retryTaskLogLambdaQueryWrapper.orderByDesc(RetryTaskLog::getCreateDt));
return new PageResult<>( return new PageResult<>(

View File

@ -1,7 +1,7 @@
package com.aizuda.easy.retry.server.service.impl; package com.aizuda.easy.retry.server.service.impl;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import com.aizuda.easy.retry.client.model.GenerateRetryBizIdDTO; import com.aizuda.easy.retry.client.model.GenerateRetryIdempotentIdDTO;
import com.aizuda.easy.retry.common.core.enums.RetryStatusEnum; 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.model.Result;
import com.aizuda.easy.retry.server.config.RequestDataHelper; import com.aizuda.easy.retry.server.config.RequestDataHelper;
@ -16,7 +16,7 @@ import com.aizuda.easy.retry.server.support.handler.ClientNodeAllocateHandler;
import com.aizuda.easy.retry.server.support.strategy.WaitStrategies; import com.aizuda.easy.retry.server.support.strategy.WaitStrategies;
import com.aizuda.easy.retry.server.web.model.base.PageResult; import com.aizuda.easy.retry.server.web.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.BatchDeleteRetryTaskVO; import com.aizuda.easy.retry.server.web.model.request.BatchDeleteRetryTaskVO;
import com.aizuda.easy.retry.server.web.model.request.GenerateRetryBizIdVO; import com.aizuda.easy.retry.server.web.model.request.GenerateRetryIdempotentIdVO;
import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO;
import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateStatusRequestVO; 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.RetryTaskSaveRequestVO;
@ -29,7 +29,6 @@ import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.text.MessageFormat; import java.text.MessageFormat;
@ -77,8 +76,8 @@ public class RetryTaskServiceImpl implements RetryTaskService {
if (StringUtils.isNotBlank(queryVO.getBizNo())) { if (StringUtils.isNotBlank(queryVO.getBizNo())) {
retryTaskLambdaQueryWrapper.eq(RetryTask::getBizNo, queryVO.getBizNo()); retryTaskLambdaQueryWrapper.eq(RetryTask::getBizNo, queryVO.getBizNo());
} }
if (StringUtils.isNotBlank(queryVO.getBizId())) { if (StringUtils.isNotBlank(queryVO.getIdempotentId())) {
retryTaskLambdaQueryWrapper.eq(RetryTask::getBizId, queryVO.getBizId()); retryTaskLambdaQueryWrapper.eq(RetryTask::getIdempotentId, queryVO.getIdempotentId());
} }
if (Objects.nonNull(queryVO.getRetryStatus())) { if (Objects.nonNull(queryVO.getRetryStatus())) {
retryTaskLambdaQueryWrapper.eq(RetryTask::getRetryStatus, queryVO.getRetryStatus()); retryTaskLambdaQueryWrapper.eq(RetryTask::getRetryStatus, queryVO.getRetryStatus());
@ -86,7 +85,7 @@ public class RetryTaskServiceImpl implements RetryTaskService {
RequestDataHelper.setPartition(queryVO.getGroupName()); RequestDataHelper.setPartition(queryVO.getGroupName());
retryTaskLambdaQueryWrapper.select(RetryTask::getId, RetryTask::getBizNo, RetryTask::getBizId, retryTaskLambdaQueryWrapper.select(RetryTask::getId, RetryTask::getBizNo, RetryTask::getIdempotentId,
RetryTask::getGroupName, RetryTask::getNextTriggerAt, RetryTask::getRetryCount, RetryTask::getGroupName, RetryTask::getNextTriggerAt, RetryTask::getRetryCount,
RetryTask::getRetryStatus, RetryTask::getUpdateDt, RetryTask::getSceneName); RetryTask::getRetryStatus, RetryTask::getUpdateDt, RetryTask::getSceneName);
pageDTO = retryTaskMapper.selectPage(pageDTO, retryTaskLambdaQueryWrapper.orderByDesc(RetryTask::getCreateDt)); pageDTO = retryTaskMapper.selectPage(pageDTO, retryTaskLambdaQueryWrapper.orderByDesc(RetryTask::getCreateDt));
@ -150,25 +149,25 @@ public class RetryTaskServiceImpl implements RetryTaskService {
} }
@Override @Override
public String bizIdGenerate(final GenerateRetryBizIdVO generateRetryBizIdVO) { public String idempotentIdGenerate(final GenerateRetryIdempotentIdVO generateRetryIdempotentIdVO) {
ServerNode serverNode = clientNodeAllocateHandler.getServerNode(generateRetryBizIdVO.getGroupName()); ServerNode serverNode = clientNodeAllocateHandler.getServerNode(generateRetryIdempotentIdVO.getGroupName());
Assert.notNull(serverNode, () -> new EasyRetryServerException("生成bizId失败: 不存在活跃的客户端节点")); Assert.notNull(serverNode, () -> new EasyRetryServerException("生成idempotentId失败: 不存在活跃的客户端节点"));
// 委托客户端生成bizId // 委托客户端生成idempotentId
String url = MessageFormat String url = MessageFormat
.format(URL, serverNode.getHostIp(), serverNode.getHostPort().toString(), serverNode.getContextPath()); .format(URL, serverNode.getHostIp(), serverNode.getHostPort().toString(), serverNode.getContextPath());
GenerateRetryBizIdDTO generateRetryBizIdDTO = new GenerateRetryBizIdDTO(); GenerateRetryIdempotentIdDTO generateRetryIdempotentIdDTO = new GenerateRetryIdempotentIdDTO();
generateRetryBizIdDTO.setGroup(generateRetryBizIdVO.getGroupName()); generateRetryIdempotentIdDTO.setGroup(generateRetryIdempotentIdVO.getGroupName());
generateRetryBizIdDTO.setScene(generateRetryBizIdVO.getSceneName()); generateRetryIdempotentIdDTO.setScene(generateRetryIdempotentIdVO.getSceneName());
generateRetryBizIdDTO.setArgsStr(generateRetryBizIdVO.getArgsStr()); generateRetryIdempotentIdDTO.setArgsStr(generateRetryIdempotentIdVO.getArgsStr());
generateRetryBizIdDTO.setExecutorName(generateRetryBizIdVO.getExecutorName()); generateRetryIdempotentIdDTO.setExecutorName(generateRetryIdempotentIdVO.getExecutorName());
HttpEntity<GenerateRetryBizIdDTO> requestEntity = new HttpEntity<>(generateRetryBizIdDTO); HttpEntity<GenerateRetryIdempotentIdDTO> requestEntity = new HttpEntity<>(generateRetryIdempotentIdDTO);
Result result = restTemplate.postForObject(url, requestEntity, Result.class); Result result = restTemplate.postForObject(url, requestEntity, Result.class);
Assert.notNull(result, () -> new EasyRetryServerException("biz生成失败")); Assert.notNull(result, () -> new EasyRetryServerException("idempotentId生成失败"));
Assert.isTrue(1 == result.getStatus(), () -> new EasyRetryServerException("biz生成失败:请确保参数与执行器名称正确")); Assert.isTrue(1 == result.getStatus(), () -> new EasyRetryServerException("idempotentId生成失败:请确保参数与执行器名称正确"));
return (String) result.getData(); return (String) result.getData();
} }

View File

@ -53,7 +53,7 @@ public class CallbackRetryResultActor extends AbstractActor {
// 回调参数 // 回调参数
RetryCallbackDTO retryCallbackDTO = new RetryCallbackDTO(); RetryCallbackDTO retryCallbackDTO = new RetryCallbackDTO();
retryCallbackDTO.setBizId(retryTask.getBizId()); retryCallbackDTO.setIdempotentId(retryTask.getIdempotentId());
retryCallbackDTO.setRetryStatus(retryTask.getRetryStatus()); retryCallbackDTO.setRetryStatus(retryTask.getRetryStatus());
retryCallbackDTO.setArgsStr(retryTask.getArgsStr()); retryCallbackDTO.setArgsStr(retryTask.getArgsStr());
retryCallbackDTO.setScene(retryTask.getSceneName()); retryCallbackDTO.setScene(retryTask.getSceneName());

View File

@ -109,7 +109,7 @@ public class ExecUnitActor extends AbstractActor {
private Result<DispatchRetryResultDTO> callClient(RetryTask retryTask, RetryTaskLog retryTaskLog, ServerNode serverNode) { private Result<DispatchRetryResultDTO> callClient(RetryTask retryTask, RetryTaskLog retryTaskLog, ServerNode serverNode) {
DispatchRetryDTO dispatchRetryDTO = new DispatchRetryDTO(); DispatchRetryDTO dispatchRetryDTO = new DispatchRetryDTO();
dispatchRetryDTO.setBizId(retryTask.getBizId()); dispatchRetryDTO.setIdempotentId(retryTask.getIdempotentId());
dispatchRetryDTO.setScene(retryTask.getSceneName()); dispatchRetryDTO.setScene(retryTask.getSceneName());
dispatchRetryDTO.setExecutorName(retryTask.getExecutorName()); dispatchRetryDTO.setExecutorName(retryTask.getExecutorName());
dispatchRetryDTO.setArgsStr(retryTask.getArgsStr()); dispatchRetryDTO.setArgsStr(retryTask.getArgsStr());

View File

@ -83,7 +83,7 @@ public class FailureActor extends AbstractActor {
// 记录重试日志 // 记录重试日志
PageDTO<RetryTaskLog> retryTaskLogPageDTO = retryTaskLogMapper.selectPage(new PageDTO<>(1, 1), PageDTO<RetryTaskLog> retryTaskLogPageDTO = retryTaskLogMapper.selectPage(new PageDTO<>(1, 1),
new LambdaQueryWrapper<RetryTaskLog>() new LambdaQueryWrapper<RetryTaskLog>()
.eq(RetryTaskLog::getBizId, retryTask.getBizId()) .eq(RetryTaskLog::getIdempotentId, retryTask.getIdempotentId())
.orderByDesc(RetryTaskLog::getId)); .orderByDesc(RetryTaskLog::getId));
List<RetryTaskLog> records = retryTaskLogPageDTO.getRecords(); List<RetryTaskLog> records = retryTaskLogPageDTO.getRecords();

View File

@ -68,7 +68,7 @@ public class FinishActor extends AbstractActor {
// 记录重试日志 // 记录重试日志
PageDTO<RetryTaskLog> retryTaskLogPageDTO = retryTaskLogMapper.selectPage(new PageDTO<>(1, 1), PageDTO<RetryTaskLog> retryTaskLogPageDTO = retryTaskLogMapper.selectPage(new PageDTO<>(1, 1),
new LambdaQueryWrapper<RetryTaskLog>() new LambdaQueryWrapper<RetryTaskLog>()
.eq(RetryTaskLog::getBizId, retryTask.getBizId()) .eq(RetryTaskLog::getIdempotentId, retryTask.getIdempotentId())
.orderByDesc(RetryTaskLog::getId)); .orderByDesc(RetryTaskLog::getId));
List<RetryTaskLog> records = retryTaskLogPageDTO.getRecords(); List<RetryTaskLog> records = retryTaskLogPageDTO.getRecords();

View File

@ -5,7 +5,7 @@ import com.aizuda.easy.retry.server.service.RetryTaskService;
import com.aizuda.easy.retry.server.web.annotation.LoginRequired; 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.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.BatchDeleteRetryTaskVO; import com.aizuda.easy.retry.server.web.model.request.BatchDeleteRetryTaskVO;
import com.aizuda.easy.retry.server.web.model.request.GenerateRetryBizIdVO; import com.aizuda.easy.retry.server.web.model.request.GenerateRetryIdempotentIdVO;
import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO; import com.aizuda.easy.retry.server.web.model.request.RetryTaskQueryVO;
import com.aizuda.easy.retry.server.web.model.request.RetryTaskUpdateStatusRequestVO; 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.RetryTaskSaveRequestVO;
@ -64,9 +64,9 @@ public class RetryTaskController {
} }
@LoginRequired @LoginRequired
@PostMapping("/generate/biz-id") @PostMapping("/generate/idempotent-id")
public Result<String> bizIdGenerate(@RequestBody @Validated GenerateRetryBizIdVO generateRetryBizIdVO) { public Result<String> idempotentIdGenerate(@RequestBody @Validated GenerateRetryIdempotentIdVO generateRetryIdempotentIdVO) {
return new Result<>(retryTaskService.bizIdGenerate(generateRetryBizIdVO)); return new Result<>(retryTaskService.idempotentIdGenerate(generateRetryIdempotentIdVO));
} }
@LoginRequired @LoginRequired

View File

@ -4,13 +4,13 @@ import lombok.Data;
import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotBlank;
/** /**
* 生成bizId模型 * 生成idempotentId模型
* *
* @auther www.byteblogs.com * @auther www.byteblogs.com
* @date 2022/03/25 10:06 * @date 2022/03/25 10:06
*/ */
@Data @Data
public class GenerateRetryBizIdVO { public class GenerateRetryIdempotentIdVO {
/** /**
* 组名称 * 组名称
*/ */

View File

@ -12,5 +12,5 @@ public class RetryDeadLetterQueryVO extends BaseQueryVO {
private String groupName; private String groupName;
private String sceneName; private String sceneName;
private String bizNo; private String bizNo;
private String bizId; private String idempotentId;
} }

View File

@ -16,5 +16,5 @@ public class RetryTaskLogQueryVO extends BaseQueryVO {
private String bizNo; private String bizNo;
private String bizId; private String idempotentId;
} }

View File

@ -17,7 +17,7 @@ public class RetryTaskQueryVO extends BaseQueryVO {
private String bizNo; private String bizNo;
private String bizId; private String idempotentId;
private Integer retryStatus; private Integer retryStatus;
} }

View File

@ -27,10 +27,10 @@ public class RetryTaskSaveRequestVO {
private String sceneName; private String sceneName;
/** /**
* 业务id(同一个场景下正在重试中的bizId不能重复) * 幂等id(同一个场景下正在重试中的idempotentId不能重复)
*/ */
@NotBlank(message = "业务id不能为空") @NotBlank(message = "幂等id不能为空")
private String bizId; private String idempotentId;
/** /**
* 业务编号 * 业务编号

View File

@ -17,7 +17,7 @@ public class RetryDeadLetterResponseVO {
private String sceneName; private String sceneName;
private String bizId; private String idempotentId;
private String bizNo; private String bizNo;

View File

@ -17,7 +17,7 @@ public class RetryTaskLogResponseVO {
private String sceneName; private String sceneName;
private String bizId; private String idempotentId;
private String bizNo; private String bizNo;

View File

@ -18,7 +18,7 @@ public class RetryTaskResponseVO {
private String sceneName; private String sceneName;
private String bizId; private String idempotentId;
private String bizNo; private String bizNo;

View File

@ -5,7 +5,7 @@
<id column="id" jdbcType="BIGINT" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="group_name" jdbcType="VARCHAR" property="groupName" /> <result column="group_name" jdbcType="VARCHAR" property="groupName" />
<result column="scene_name" jdbcType="VARCHAR" property="sceneName" /> <result column="scene_name" jdbcType="VARCHAR" property="sceneName" />
<result column="biz_id" jdbcType="VARCHAR" property="bizId" /> <result column="idempotent_id" jdbcType="VARCHAR" property="idempotentId" />
<result column="biz_no" jdbcType="VARCHAR" property="bizNo" /> <result column="biz_no" jdbcType="VARCHAR" property="bizNo" />
<result column="executor_name" jdbcType="VARCHAR" property="executorName" /> <result column="executor_name" jdbcType="VARCHAR" property="executorName" />
<result column="args_str" jdbcType="VARCHAR" property="argsStr" /> <result column="args_str" jdbcType="VARCHAR" property="argsStr" />
@ -13,17 +13,17 @@
<result column="create_dt" jdbcType="TIMESTAMP" property="createDt" /> <result column="create_dt" jdbcType="TIMESTAMP" property="createDt" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, group_name, scene_name, biz_id, biz_no, executor_name, args_str, ext_attrs, create_dt id, group_name, scene_name, idempotent_id, biz_no, executor_name, args_str, ext_attrs, create_dt
</sql> </sql>
<insert id="insertBatch"> <insert id="insertBatch">
insert into retry_dead_letter_${partition} (id, group_name, scene_name, insert into retry_dead_letter_${partition} (id, group_name, scene_name,
biz_id, biz_no, executor_name, args_str, idempotent_id, biz_no, executor_name, args_str,
ext_attrs, create_dt ext_attrs, create_dt
) )
values values
<foreach collection="retryDeadLetters" item="retryDeadLetter" separator=","> <foreach collection="retryDeadLetters" item="retryDeadLetter" separator=",">
(#{retryDeadLetter.id,jdbcType=BIGINT}, #{retryDeadLetter.groupName,jdbcType=VARCHAR}, #{retryDeadLetter.sceneName,jdbcType=VARCHAR}, (#{retryDeadLetter.id,jdbcType=BIGINT}, #{retryDeadLetter.groupName,jdbcType=VARCHAR}, #{retryDeadLetter.sceneName,jdbcType=VARCHAR},
#{retryDeadLetter.bizId,jdbcType=VARCHAR}, #{retryDeadLetter.bizNo,jdbcType=VARCHAR}, #{retryDeadLetter.executorName,jdbcType=VARCHAR}, #{retryDeadLetter.argsStr,jdbcType=VARCHAR}, #{retryDeadLetter.idempotentId,jdbcType=VARCHAR}, #{retryDeadLetter.bizNo,jdbcType=VARCHAR}, #{retryDeadLetter.executorName,jdbcType=VARCHAR}, #{retryDeadLetter.argsStr,jdbcType=VARCHAR},
#{retryDeadLetter.extAttrs,jdbcType=VARCHAR}, #{retryDeadLetter.createDt,jdbcType=TIMESTAMP}) #{retryDeadLetter.extAttrs,jdbcType=VARCHAR}, #{retryDeadLetter.createDt,jdbcType=TIMESTAMP})
</foreach> </foreach>
</insert> </insert>

View File

@ -5,7 +5,7 @@
<id column="id" jdbcType="BIGINT" property="id"/> <id column="id" jdbcType="BIGINT" property="id"/>
<result column="group_name" jdbcType="VARCHAR" property="groupName"/> <result column="group_name" jdbcType="VARCHAR" property="groupName"/>
<result column="scene_name" jdbcType="VARCHAR" property="sceneName"/> <result column="scene_name" jdbcType="VARCHAR" property="sceneName"/>
<result column="biz_id" jdbcType="VARCHAR" property="bizId"/> <result column="idempotent_id" jdbcType="VARCHAR" property="idempotentId"/>
<result column="biz_no" jdbcType="VARCHAR" property="bizNo"/> <result column="biz_no" jdbcType="VARCHAR" property="bizNo"/>
<result column="executor_name" jdbcType="VARCHAR" property="executorName"/> <result column="executor_name" jdbcType="VARCHAR" property="executorName"/>
<result column="args_str" jdbcType="VARCHAR" property="argsStr"/> <result column="args_str" jdbcType="VARCHAR" property="argsStr"/>
@ -16,7 +16,7 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
, group_name, scene_name, biz_id, biz_no, executor_name, args_str, ext_attrs, retry_status, error_message, , group_name, scene_name, idempotent_id, biz_no, executor_name, args_str, ext_attrs, retry_status, error_message,
create_dt create_dt
</sql> </sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap"> <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
@ -28,22 +28,22 @@
<select id="countTaskTotal" resultType="java.lang.Long"> <select id="countTaskTotal" resultType="java.lang.Long">
select count(*) select count(*)
from ( from (
select group_name, scene_name, biz_id from retry_task_log group by group_name, scene_name, biz_id) a select group_name, scene_name, idempotent_id from retry_task_log group by group_name, scene_name, idempotent_id) a
</select> </select>
<select id="countTaskByRetryStatus" resultType="java.lang.Long"> <select id="countTaskByRetryStatus" resultType="java.lang.Long">
select count(*) select count(*)
from ( from (
select group_name, scene_name, biz_id select group_name, scene_name, idempotent_id
from retry_task_log from retry_task_log
where retry_status = #{retryStatus} where retry_status = #{retryStatus}
group by group_name, scene_name, biz_id) a group by group_name, scene_name, idempotent_id) a
</select> </select>
<select id="rankSceneQuantity" <select id="rankSceneQuantity"
resultType="com.aizuda.easy.retry.server.web.model.response.SceneQuantityRankResponseVO"> resultType="com.aizuda.easy.retry.server.web.model.response.SceneQuantityRankResponseVO">
select group_name, scene_name, count(*) total select group_name, scene_name, count(*) total
from ( from (
select group_name, scene_name, biz_id, count(*) select group_name, scene_name, idempotent_id, count(*)
from retry_task_log from retry_task_log
<where> <where>
<if test="groupName != '' and groupName != null"> <if test="groupName != '' and groupName != null">
@ -51,7 +51,7 @@
</if> </if>
and create_dt >= #{startTime} and create_dt &lt;= #{endTime} and create_dt >= #{startTime} and create_dt &lt;= #{endTime}
</where> </where>
group by group_name, scene_name, biz_id) a group by group_name, scene_name, idempotent_id) a
group by group_name, scene_name group by group_name, scene_name
order by total desc; order by total desc;
</select> </select>
@ -60,7 +60,7 @@
select select
distinct(create_dt), count(*) total distinct(create_dt), count(*) total
from ( from (
select group_name, scene_name, biz_id, select group_name, scene_name, idempotent_id,
<choose> <choose>
<when test="type == 'day'"> <when test="type == 'day'">
DATE_FORMAT(create_dt,'%H') DATE_FORMAT(create_dt,'%H')
@ -90,7 +90,7 @@
and create_dt >= #{startTime} and create_dt &lt;= #{endTime} and create_dt >= #{startTime} and create_dt &lt;= #{endTime}
</where> </where>
group by group_name, scene_name, biz_id, create_dt) a group by group_name, scene_name, idempotent_id, create_dt) a
group by create_dt group by create_dt
order by total desc; order by total desc;
</select> </select>

View File

@ -5,7 +5,7 @@
<id column="id" jdbcType="BIGINT" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="group_name" jdbcType="VARCHAR" property="groupName" /> <result column="group_name" jdbcType="VARCHAR" property="groupName" />
<result column="scene_name" jdbcType="VARCHAR" property="sceneName" /> <result column="scene_name" jdbcType="VARCHAR" property="sceneName" />
<result column="biz_id" jdbcType="VARCHAR" property="bizId" /> <result column="idempotent_id" jdbcType="VARCHAR" property="idempotentId" />
<result column="biz_no" jdbcType="VARCHAR" property="bizNo" /> <result column="biz_no" jdbcType="VARCHAR" property="bizNo" />
<result column="executor_name" jdbcType="VARCHAR" property="executorName" /> <result column="executor_name" jdbcType="VARCHAR" property="executorName" />
<result column="args_str" jdbcType="VARCHAR" property="argsStr" /> <result column="args_str" jdbcType="VARCHAR" property="argsStr" />
@ -17,7 +17,7 @@
<result column="update_dt" jdbcType="TIMESTAMP" property="updateDt" /> <result column="update_dt" jdbcType="TIMESTAMP" property="updateDt" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, group_name, scene_name, biz_id, biz_no, executor_name, args_str, ext_attrs, next_trigger_at, retry_count, retry_status, id, group_name, scene_name, idempotent_id, biz_no, executor_name, args_str, ext_attrs, next_trigger_at, retry_count, retry_status,
create_dt, update_dt create_dt, update_dt
</sql> </sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap"> <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
@ -59,7 +59,7 @@
<select id="selectRetryTaskByGroupIdAndSceneId" resultMap="BaseResultMap"> <select id="selectRetryTaskByGroupIdAndSceneId" resultMap="BaseResultMap">
select select
<include refid="Base_Column_List" /> <include refid="Base_Column_List" />
from retry_task_${partition} where biz_id = #{bizId,jdbcType=VARCHAR} AND scene_id = #{sceneId,jdbcType=VARCHAR} from retry_task_${partition} where idempotent_id = #{idempotentId,jdbcType=VARCHAR} AND scene_id = #{sceneId,jdbcType=VARCHAR}
</select> </select>
<select id="selectRetryTaskPage" resultMap="BaseResultMap"> <select id="selectRetryTaskPage" resultMap="BaseResultMap">
select select

File diff suppressed because it is too large Load Diff

View File

@ -59,7 +59,7 @@ public class ExampleApplicationTests {
int finalI = i; int finalI = i;
new Thread(() -> { new Thread(() -> {
RetryTaskDTO retryTaskDTO = new RetryTaskDTO(); RetryTaskDTO retryTaskDTO = new RetryTaskDTO();
retryTaskDTO.setBizId(finalI + ""); retryTaskDTO.setIdempotentId(finalI + "");
ConcurrentLinkedQueue<RetryTaskDTO> value = retryLeapArray.currentWindow().value(); ConcurrentLinkedQueue<RetryTaskDTO> value = retryLeapArray.currentWindow().value();
value.add(retryTaskDTO); value.add(retryTaskDTO);
}).start(); }).start();

View File

@ -14,7 +14,7 @@ const api = {
retryTaskPage: '/retry-task/list', retryTaskPage: '/retry-task/list',
retryTaskById: '/retry-task/', retryTaskById: '/retry-task/',
saveRetryTask: '/retry-task', saveRetryTask: '/retry-task',
bizIdGenerate: '/retry-task/generate/biz-id', idempotentIdGenerate: '/retry-task/generate/idempotent-id',
batchUpdate: '/retry-task/batch', batchUpdate: '/retry-task/batch',
deleteRetryTask: '/retry-task/batch', deleteRetryTask: '/retry-task/batch',
updateRetryTaskStatus: '/retry-task/status', updateRetryTaskStatus: '/retry-task/status',
@ -56,9 +56,9 @@ export function batchUpdate (data) {
}) })
} }
export function bizIdGenerate (data) { export function idempotentIdGenerate (data) {
return request({ return request({
url: api.bizIdGenerate, url: api.idempotentIdGenerate,
method: 'post', method: 'post',
data data
}) })

View File

@ -10,7 +10,7 @@
{{ retryDealLetterInfo.sceneName }} {{ retryDealLetterInfo.sceneName }}
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="业务id" span="2"> <a-descriptions-item label="业务id" span="2">
{{ retryDealLetterInfo.bizId }} {{ retryDealLetterInfo.idempotentId }}
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="业务编号"> <a-descriptions-item label="业务编号">
{{ retryDealLetterInfo.bizNo }} {{ retryDealLetterInfo.bizNo }}

View File

@ -25,7 +25,7 @@
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务id"> <a-form-item label="业务id">
<a-input v-model="queryParam.bizId" placeholder="请输入业务id" allowClear/> <a-input v-model="queryParam.idempotentId" placeholder="请输入业务id" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>
@ -139,8 +139,8 @@ export default {
ellipsis: true ellipsis: true
}, },
{ {
title: '业务id', title: '幂等id',
dataIndex: 'bizId', dataIndex: 'idempotentId',
ellipsis: true ellipsis: true
}, },
{ {

View File

@ -10,7 +10,7 @@
{{ retryInfo.sceneName }} {{ retryInfo.sceneName }}
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="业务id" span="2"> <a-descriptions-item label="业务id" span="2">
{{ retryInfo.bizId }} {{ retryInfo.idempotentId }}
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="业务编号"> <a-descriptions-item label="业务编号">
{{ retryInfo.bizNo }} {{ retryInfo.bizNo }}

View File

@ -25,7 +25,7 @@
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务id"> <a-form-item label="业务id">
<a-input v-model="queryParam.bizId" placeholder="请输入业务id" allowClear/> <a-input v-model="queryParam.idempotentId" placeholder="请输入业务id" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>
@ -115,8 +115,8 @@ export default {
ellipsis: true ellipsis: true
}, },
{ {
title: '业务id', title: '幂等id',
dataIndex: 'bizId' dataIndex: 'idempotentId'
}, },
{ {
title: '业务编号', title: '业务编号',

View File

@ -10,7 +10,7 @@
{{ retryTaskInfo.sceneName }} {{ retryTaskInfo.sceneName }}
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="业务id" span="2"> <a-descriptions-item label="业务id" span="2">
{{ retryTaskInfo.bizId }} {{ retryTaskInfo.idempotentId }}
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="业务编号"> <a-descriptions-item label="业务编号">
{{ retryTaskInfo.bizNo }} {{ retryTaskInfo.bizNo }}

View File

@ -40,7 +40,7 @@
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务id"> <a-form-item label="业务id">
<a-input v-model="queryParam.bizId" placeholder="请输入业务id" allowClear /> <a-input v-model="queryParam.idempotentId" placeholder="请输入业务id" allowClear />
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>
@ -156,8 +156,8 @@ export default {
dataIndex: 'sceneName' dataIndex: 'sceneName'
}, },
{ {
title: '业务id', title: '幂等id',
dataIndex: 'bizId' dataIndex: 'idempotentId'
}, },
{ {
title: '业务编号', title: '业务编号',

View File

@ -29,15 +29,15 @@
</a-form-item> </a-form-item>
<a-form-item label="重试ID"> <a-form-item label="重试ID">
<a-input <a-input
v-decorator="['bizId', { rules: [{ required: true, message: '请输入重试ID' }] }]" v-decorator="['idempotentId', { rules: [{ required: true, message: '请输入重试ID' }] }]"
name="bizId" name="idempotentId"
placeholder="请输入业务编号" placeholder="请输入业务编号"
> >
<a-tooltip slot="suffix" title="同一个场景下正在重试中的重试ID不能重复,若重复的重试ID在上报时会被幂等处理"> <a-tooltip slot="suffix" title="同一个场景下正在重试中的重试ID不能重复,若重复的重试ID在上报时会被幂等处理">
<a-icon type="info-circle" style="color: rgba(0, 0, 0, 0.45)" /> <a-icon type="info-circle" style="color: rgba(0, 0, 0, 0.45)" />
</a-tooltip> </a-tooltip>
</a-input> </a-input>
<a-button type="primary" style="position: absolute; margin: 3px 10px" @click="bizIdGenerate"> 生成 </a-button> <a-button type="primary" style="position: absolute; margin: 3px 10px" @click="idempotentIdGenerate"> 生成 </a-button>
</a-form-item> </a-form-item>
<a-form-item label="业务编号"> <a-form-item label="业务编号">
<a-input <a-input
@ -71,7 +71,7 @@
</template> </template>
<script> <script>
import { getAllGroupNameList, getSceneList, saveRetryTask, bizIdGenerate } from '@/api/manage' import { getAllGroupNameList, getSceneList, saveRetryTask, idempotentIdGenerate } from '@/api/manage'
export default { export default {
name: 'SavRetryTask', name: 'SavRetryTask',
@ -121,15 +121,15 @@ export default {
this.groupNameList = res.data this.groupNameList = res.data
}) })
}, },
bizIdGenerate () { idempotentIdGenerate () {
const groupName = this.form.getFieldValue('groupName') const groupName = this.form.getFieldValue('groupName')
const sceneName = this.form.getFieldValue('sceneName') const sceneName = this.form.getFieldValue('sceneName')
const executorName = this.form.getFieldValue('executorName') const executorName = this.form.getFieldValue('executorName')
const argsStr = this.form.getFieldValue('argsStr') const argsStr = this.form.getFieldValue('argsStr')
bizIdGenerate({ groupName, sceneName, executorName, argsStr }).then(res => { idempotentIdGenerate({ groupName, sceneName, executorName, argsStr }).then(res => {
this.form.setFieldsValue({ this.form.setFieldsValue({
'bizId': res.data 'idempotentId': res.data
}) })
}) })
} }