build(hwmom-dms):引入 TransmittableThreadLocal 解决异步线程中 Sa-Token 丢失问题

- 在 pom.xml 中添加 TransmittableThreadLocal依赖
- 版本:2.14.4
-用途:解决 Dubbo 远程调用 workflow 服务时在异步线程中丢失 Sa-Token 的问题
master
zch 3 days ago
parent 68a3531285
commit d6edf87fcb

@ -194,6 +194,15 @@
</exclusions> </exclusions>
</dependency> </dependency>
<!--通过 Dubbo 远程调用 workflow 服务的 completeTask 方法时。
原因分析:该调用是在一个由 CompletableFuture.runAsync() 创建的异步线程中执行的。在 ruoyi-cloud-plus (以及类似的微服务架构) 中,用户认证信息(如 Sa-Token通常是存储在 ThreadLocal 变量中的,它与当前请求线程绑定。当您创建一个新的子线程时,父线程的 ThreadLocal 变量默认不会传递给子线程。因此在异步线程中Sa-Token 的上下文丢失,导致 StpUtil.getTokenValue() 等方法无法获取到 token当 Dubbo 客户端过滤器尝试将 token 放入 RPC 上下文时失败,或者说,在 workflow 服务端Sa-Token 的服务端过滤器无法从 RPC 上下文中获取到 token最终导致依赖用户身份认证的 FlwTaskServiceImpl.completeTask 方法抛出 "未能读取到有效 token" 的业务异常。
解决方案ruoyi-cloud-plus 框架集成了阿里巴巴的 TransmittableThreadLocal (TTL) 库来解决此问题。TTL可以实现父子线程之间的 ThreadLocal 数据传递。为了让 CompletableFuture 与 TTL 协同工作,需要将提交给它的 Runnable 或 Callable 任务用 TtlRunnable 或 TtlCallable 进行包装。这样在任务执行前TTL 会捕获父线程的上下文(包括 Sa-Token 的信息),并在子线程中恢复它。-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.14.4</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

Loading…
Cancel
Save