|
|
|
@ -194,6 +194,15 @@
|
|
|
|
|
</exclusions>
|
|
|
|
|
</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>
|
|
|
|
|
|
|
|
|
|
<build>
|
|
|
|
|