From e0b10cf1a8a931f81cb74755cd7fc2476157e1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 3 Jan 2024 17:45:10 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4ThreadLocalHolder(=E4=B8=8D=E5=8F=AF=E6=8E=A7=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=A4=AA=E5=A4=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/context/ThreadLocalHolder.java | 57 ------------------- .../dict/service/impl/DictServiceImpl.java | 10 ++-- .../aspectj/RepeatSubmitAspect.java | 29 +++++----- .../dromara/common/log/aspect/LogAspect.java | 9 ++- .../common/tenant/helper/TenantHelper.java | 19 ++++--- 5 files changed, 32 insertions(+), 92 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java deleted file mode 100644 index e527dab9..00000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.dromara.common.core.context; - -import com.alibaba.ttl.TransmittableThreadLocal; - -import java.util.HashMap; -import java.util.Map; - -/** - * 线程持有类 - * - * @author Michelle.Chung - */ -public class ThreadLocalHolder { - - /** - * 初始化 (支持异步) - */ - private static final ThreadLocal> THREAD_LOCAL = TransmittableThreadLocal.withInitial(HashMap::new); - - /** - * 设置值 - * - * @param key 键 - * @param value 值 - */ - public static void set(String key, T value) { - THREAD_LOCAL.get().put(key, value); - } - - /** - * 获取值 - * - * @param key 键 - * @return 值 - */ - @SuppressWarnings("unchecked") - public static T get(String key) { - return (T) THREAD_LOCAL.get().get(key); - } - - /** - * 移除值 - * - * @param key 键 - */ - public static void remove(String key) { - THREAD_LOCAL.get().remove(key); - } - - /** - * 清空值 - */ - public static void clear() { - THREAD_LOCAL.remove(); - } - -} diff --git a/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java b/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java index 1c96654b..51936131 100644 --- a/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java +++ b/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java @@ -1,9 +1,9 @@ package org.dromara.common.dict.service.impl; +import cn.dev33.satoken.context.SaHolder; import cn.hutool.core.util.ObjectUtil; import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.core.constant.CacheConstants; -import org.dromara.common.core.context.ThreadLocalHolder; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -38,10 +38,10 @@ public class DictServiceImpl implements DictService { @Override public String getDictLabel(String dictType, String dictValue, String separator) { // 优先从本地缓存获取 - List datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType); + List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); if (ObjectUtil.isNull(datas)) { datas = remoteDictService.selectDictDataByType(dictType); - ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas); + SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); } Map map = StreamUtils.toMap(datas, RemoteDictDataVo::getDictValue, RemoteDictDataVo::getDictLabel); @@ -65,10 +65,10 @@ public class DictServiceImpl implements DictService { @Override public String getDictValue(String dictType, String dictLabel, String separator) { // 优先从本地缓存获取 - List datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType); + List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); if (ObjectUtil.isNull(datas)) { datas = remoteDictService.selectDictDataByType(dictType); - ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas); + SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); } Map map = StreamUtils.toMap(datas, RemoteDictDataVo::getDictLabel, RemoteDictDataVo::getDictValue); diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java index b3501702..d0c6a61a 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java @@ -4,8 +4,14 @@ import cn.dev33.satoken.SaManager; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.SecureUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.context.ThreadLocalHolder; import org.dromara.common.core.domain.R; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MessageUtils; @@ -14,13 +20,6 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; import org.springframework.validation.BindingResult; import org.springframework.web.multipart.MultipartFile; @@ -37,7 +36,7 @@ import java.util.StringJoiner; @Aspect public class RepeatSubmitAspect { - private static final String KEY_CACHE = "keyCache"; + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); @Before("@annotation(repeatSubmit)") public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable { @@ -60,7 +59,7 @@ public class RepeatSubmitAspect { // 唯一标识(指定key + url + 消息头) String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey; if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) { - ThreadLocalHolder.set(KEY_CACHE, cacheRepeatKey); + KEY_CACHE.set(cacheRepeatKey); } else { String message = repeatSubmit.message(); if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { @@ -83,10 +82,9 @@ public class RepeatSubmitAspect { if (r.getCode() == R.SUCCESS) { return; } - String cacheKey = ThreadLocalHolder.get(KEY_CACHE); - RedisUtils.deleteObject(cacheKey); + RedisUtils.deleteObject(KEY_CACHE.get()); } finally { - ThreadLocalHolder.remove(KEY_CACHE); + KEY_CACHE.remove(); } } } @@ -99,9 +97,8 @@ public class RepeatSubmitAspect { */ @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { - String cacheKey = ThreadLocalHolder.get(KEY_CACHE); - RedisUtils.deleteObject(cacheKey); - ThreadLocalHolder.remove(KEY_CACHE); + RedisUtils.deleteObject(KEY_CACHE.get()); + KEY_CACHE.remove(); } /** diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index 6b35d78d..4ba75ffe 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -13,7 +13,6 @@ import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; -import org.dromara.common.core.context.ThreadLocalHolder; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; @@ -51,7 +50,7 @@ public class LogAspect { /** * 计时 key */ - private static final String LOG_STOP_WATCH_KEY = "logStopwatch"; + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); /** * 处理请求前执行 @@ -59,7 +58,7 @@ public class LogAspect { @Before(value = "@annotation(controllerLog)") public void boBefore(JoinPoint joinPoint, Log controllerLog) { StopWatch stopWatch = new StopWatch(); - ThreadLocalHolder.set(LOG_STOP_WATCH_KEY, stopWatch); + KEY_CACHE.set(stopWatch); stopWatch.start(); } @@ -112,7 +111,7 @@ public class LogAspect { // 处理设置注解上的参数 getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); // 设置消耗时间 - StopWatch stopWatch = ThreadLocalHolder.get(LOG_STOP_WATCH_KEY); + StopWatch stopWatch = KEY_CACHE.get(); stopWatch.stop(); operLog.setCostTime(stopWatch.getTime()); // 发布事件保存数据库 @@ -122,7 +121,7 @@ public class LogAspect { log.error("异常信息:{}", exp.getMessage()); exp.printStackTrace(); } finally { - ThreadLocalHolder.remove(LOG_STOP_WATCH_KEY); + KEY_CACHE.remove(); } } diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 7a3a431c..e830c190 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -1,14 +1,15 @@ package org.dromara.common.tenant.helper; +import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.convert.Convert; +import com.alibaba.ttl.TransmittableThreadLocal; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.context.ThreadLocalHolder; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.utils.RedisUtils; @@ -27,7 +28,7 @@ public class TenantHelper { private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant"; - private static final String TENANT_ID_KEY = "tempDynamicTenant"; + private static final ThreadLocal TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>(); /** * 租户功能是否启用 @@ -88,12 +89,12 @@ public class TenantHelper { return; } if (!isLogin()) { - ThreadLocalHolder.set(TENANT_ID_KEY, tenantId); + TEMP_DYNAMIC_TENANT.set(tenantId); return; } String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); RedisUtils.setCacheObject(cacheKey, tenantId); - ThreadLocalHolder.set(cacheKey, tenantId); + SaHolder.getStorage().set(cacheKey, tenantId); } /** @@ -106,15 +107,15 @@ public class TenantHelper { return null; } if (!isLogin()) { - return ThreadLocalHolder.get(TENANT_ID_KEY); + return TEMP_DYNAMIC_TENANT.get(); } String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); - String tenantId = ThreadLocalHolder.get(cacheKey); + String tenantId = (String) SaHolder.getStorage().get(cacheKey); if (StringUtils.isNotBlank(tenantId)) { return tenantId; } tenantId = RedisUtils.getCacheObject(cacheKey); - ThreadLocalHolder.set(cacheKey, tenantId); + SaHolder.getStorage().set(cacheKey, tenantId); return tenantId; } @@ -126,12 +127,12 @@ public class TenantHelper { return; } if (!isLogin()) { - ThreadLocalHolder.remove(TENANT_ID_KEY); + TEMP_DYNAMIC_TENANT.remove(); return; } String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); RedisUtils.deleteObject(cacheKey); - ThreadLocalHolder.remove(cacheKey); + SaHolder.getStorage().delete(cacheKey); } /**