From 6b95083c63de6a8eb7a7d08e6d537ec7afdb32f8 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Sun, 1 Jun 2025 11:10:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(idempotent):=20=E6=96=B0=E5=A2=9E=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=B9=82=E7=AD=89=E5=90=8D=E7=A7=B0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- continew-starter-idempotent/pom.xml | 6 +++ .../IdempotentAutoConfiguration.java | 9 +--- .../DefaultIdempotentNameGenerator.java | 51 +++++++++++++++++++ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/generator/DefaultIdempotentNameGenerator.java diff --git a/continew-starter-idempotent/pom.xml b/continew-starter-idempotent/pom.xml index 12b86241..fd4d1679 100644 --- a/continew-starter-idempotent/pom.xml +++ b/continew-starter-idempotent/pom.xml @@ -18,5 +18,11 @@ top.continew continew-starter-cache-redisson + + + + cn.hutool + hutool-crypto + \ No newline at end of file diff --git a/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/autoconfigure/IdempotentAutoConfiguration.java b/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/autoconfigure/IdempotentAutoConfiguration.java index 34abb9c1..7484ff53 100644 --- a/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/autoconfigure/IdempotentAutoConfiguration.java +++ b/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/autoconfigure/IdempotentAutoConfiguration.java @@ -19,16 +19,15 @@ package top.continew.starter.idempotent.autoconfigure; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.ResolvableType; import top.continew.starter.cache.redisson.autoconfigure.RedissonAutoConfiguration; import top.continew.starter.core.constant.PropertiesConstants; import top.continew.starter.idempotent.aop.IdempotentAspect; +import top.continew.starter.idempotent.generator.DefaultIdempotentNameGenerator; import top.continew.starter.idempotent.generator.IdempotentNameGenerator; /** @@ -60,11 +59,7 @@ public class IdempotentAutoConfiguration { @Bean @ConditionalOnMissingBean public IdempotentNameGenerator idempotentNameGenerator() { - if (log.isErrorEnabled()) { - log.error("Consider defining a bean of type '{}' in your configuration.", ResolvableType - .forClass(IdempotentNameGenerator.class)); - } - throw new NoSuchBeanDefinitionException(IdempotentNameGenerator.class); + return new DefaultIdempotentNameGenerator(); } @PostConstruct diff --git a/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/generator/DefaultIdempotentNameGenerator.java b/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/generator/DefaultIdempotentNameGenerator.java new file mode 100644 index 00000000..741bf8b6 --- /dev/null +++ b/continew-starter-idempotent/src/main/java/top/continew/starter/idempotent/generator/DefaultIdempotentNameGenerator.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.continew.starter.idempotent.generator; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.json.JSONUtil; +import top.continew.starter.core.constant.StringConstants; + +import java.lang.reflect.Method; + +/** + * 默认幂等名称生成器 + * + * @author Charles7c + * @since 2.12.1 + */ +public class DefaultIdempotentNameGenerator implements IdempotentNameGenerator { + + @Override + public String generate(Object target, Method method, Object... args) { + StringBuilder nameSb = new StringBuilder(); + // 添加类名 + nameSb.append(ClassUtil.getClassName(target, false)); + nameSb.append(StringConstants.COLON); + // 添加方法名 + nameSb.append(method.getName()); + // 添加参数信息的哈希值(如果有参数) + if (args != null && args.length > 0) { + nameSb.append(StringConstants.COLON); + // 使用JSONUtil序列化参数,然后计算哈希值以确保唯一性 + String argsJson = JSONUtil.toJsonStr(args); + nameSb.append(DigestUtil.md5Hex(argsJson)); + } + return nameSb.toString(); + } +}