diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 0cf5d75..7932393 100755 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -7,10 +7,14 @@ + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index 1c5170e..ed81959 100755 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -12,6 +12,11 @@ + diff --git a/han-note-auth/pom.xml b/han-note-auth/pom.xml index f48f523..7f37689 100755 --- a/han-note-auth/pom.xml +++ b/han-note-auth/pom.xml @@ -93,8 +93,10 @@ com.hanserwei hanserwei-common - - + + com.hanserwei + hanserwei-spring-boot-starter-biz-context + diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java index 2838e5d..db00b49 100644 --- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java +++ b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.base.Preconditions; +import com.hanserwei.framework.biz.context.holder.LoginUserContextHolder; import com.hanserwei.framework.common.enums.DeletedEnum; import com.hanserwei.framework.common.enums.StatusEnum; import com.hanserwei.framework.common.exception.ApiException; @@ -21,13 +22,14 @@ import com.hanserwei.hannote.auth.domain.mapper.UserDOMapper; import com.hanserwei.hannote.auth.domain.mapper.UserRoleDOMapper; import com.hanserwei.hannote.auth.enums.LoginTypeEnum; import com.hanserwei.hannote.auth.enums.ResponseCodeEnum; -import com.hanserwei.hannote.auth.filter.LoginUserContextHolder; import com.hanserwei.hannote.auth.model.vo.user.UserLoginReqVO; import com.hanserwei.hannote.auth.service.UserService; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate; @@ -46,6 +48,8 @@ public class UserServiceImpl extends ServiceImpl implement private final UserRoleDOMapper userRoleDOMapper; private final TransactionTemplate transactionTemplate; private final RoleDOMapper roleDOMapper; + @Resource(name = "authTaskExecutor") + private ThreadPoolTaskExecutor authTaskExecutor; @Override public Response loginAndRegister(UserLoginReqVO reqVO) { @@ -147,6 +151,10 @@ public class UserServiceImpl extends ServiceImpl implement @Override public Response logout() { Long userId = LoginUserContextHolder.getUserId(); + authTaskExecutor.submit(() -> { + Long userId2 = LoginUserContextHolder.getUserId(); + log.info("==> 异步线程中获取 userId: {}", userId2); + }); StpUtil.logout(userId); return Response.success(); } diff --git a/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/pom.xml b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/pom.xml new file mode 100644 index 0000000..6f4ca31 --- /dev/null +++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + + com.hanserwei + hanserwei-framework + ${revision} + + + jar + + hanserwei-spring-boot-starter-biz-context + ${project.artifactId} + 业务上下文组件 + + + + UTF-8 + + + + + com.hanserwei + hanserwei-common + + + org.springframework.boot + spring-boot-autoconfigure + + + jakarta.servlet + jakarta.servlet-api + + + org.springframework + spring-web + + + org.springframework.boot + spring-boot-starter-logging + + + com.alibaba + transmittable-thread-local + + + + diff --git a/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/config/ContextAutoConfiguration.java b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/config/ContextAutoConfiguration.java new file mode 100644 index 0000000..6e9a533 --- /dev/null +++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/config/ContextAutoConfiguration.java @@ -0,0 +1,13 @@ +package com.hanserwei.framework.biz.context.config; + +import com.hanserwei.framework.biz.context.filter.HeaderUserId2ContextFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +public class ContextAutoConfiguration { + @Bean + public HeaderUserId2ContextFilter headerUserId2ContextFilter() { + return new HeaderUserId2ContextFilter(); + } +} diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/HeaderUserId2ContextFilter.java b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/filter/HeaderUserId2ContextFilter.java similarity index 74% rename from han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/HeaderUserId2ContextFilter.java rename to hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/filter/HeaderUserId2ContextFilter.java index 68cef3c..fcfe06f 100644 --- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/HeaderUserId2ContextFilter.java +++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/filter/HeaderUserId2ContextFilter.java @@ -1,5 +1,6 @@ -package com.hanserwei.hannote.auth.filter; +package com.hanserwei.framework.biz.context.filter; +import com.hanserwei.framework.biz.context.holder.LoginUserContextHolder; import com.hanserwei.framework.common.constant.GlobalConstants; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -12,18 +13,17 @@ import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; -@Component @Slf4j public class HeaderUserId2ContextFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - - // 从请求头中获取用户 ID + log.info("=====> HeaderUserId2ContextFilter 开始执行"); + // 从请求头中获取用户 ID String userId = request.getHeader(GlobalConstants.USER_ID); - log.info("## HeaderUserId2ContextFilter, 用户 ID: {}", userId); + log.info("=====> HeaderUserId2ContextFilter, 用户 ID: {}", userId); // 判断请求头中是否存在用户 ID if (StringUtils.isBlank(userId)) { @@ -33,7 +33,7 @@ public class HeaderUserId2ContextFilter extends OncePerRequestFilter { } // 如果 header 中存在 userId,则设置到 ThreadLocal 中 - log.info("===== 设置 userId 到 ThreadLocal 中, 用户 ID: {}", userId); + log.info("=====> 设置 userId 到 ThreadLocal 中, 用户 ID: {}", userId); LoginUserContextHolder.setUserId(userId); try { @@ -41,7 +41,7 @@ public class HeaderUserId2ContextFilter extends OncePerRequestFilter { } finally { // 一定要删除 ThreadLocal ,防止内存泄露 LoginUserContextHolder.remove(); - log.info("===== 删除 ThreadLocal, userId: {}", userId); + log.info("=====> 删除 ThreadLocal, userId: {}", userId); } } } \ No newline at end of file diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/LoginUserContextHolder.java b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/holder/LoginUserContextHolder.java similarity index 85% rename from han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/LoginUserContextHolder.java rename to hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/holder/LoginUserContextHolder.java index f08b414..95dd8b6 100644 --- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/LoginUserContextHolder.java +++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/holder/LoginUserContextHolder.java @@ -1,5 +1,6 @@ -package com.hanserwei.hannote.auth.filter; +package com.hanserwei.framework.biz.context.holder; +import com.alibaba.ttl.TransmittableThreadLocal; import com.hanserwei.framework.common.constant.GlobalConstants; import java.util.HashMap; @@ -10,7 +11,7 @@ public class LoginUserContextHolder { // 初始化一个 ThreadLocal 变量 private static final ThreadLocal> LOGIN_USER_CONTEXT_THREAD_LOCAL - = ThreadLocal.withInitial(HashMap::new); + = TransmittableThreadLocal.withInitial(HashMap::new); /** diff --git a/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..d6d4fbb --- /dev/null +++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.hanserwei.framework.biz.context.config.ContextAutoConfiguration \ No newline at end of file diff --git a/hanserwei-framework/pom.xml b/hanserwei-framework/pom.xml index f6fb978..42b9c07 100755 --- a/hanserwei-framework/pom.xml +++ b/hanserwei-framework/pom.xml @@ -9,6 +9,7 @@ hanserwei-common hanserwei-spring-boot-starter-biz-operationlog + hanserwei-spring-boot-starter-biz-context hanserwei-spring-boot-starter-jackson diff --git a/pom.xml b/pom.xml index 9f15113..ef8700b 100755 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,7 @@ 33.5.0-jre 5.8.40 3.19.0 + 2.14.5 @@ -101,6 +102,11 @@ hanserwei-spring-boot-starter-jackson ${revision} + + com.hanserwei + hanserwei-spring-boot-starter-biz-context + ${revision} + com.baomidou mybatis-plus-bom @@ -150,6 +156,11 @@ sa-token-reactor-spring-boot3-starter ${sa-token.version} + + com.alibaba + transmittable-thread-local + ${transmittable-thread-local.version} +