Closed houkunlin closed 8 months ago
说明不是一个线程,同一个线程内是一样的,可以贴一下你的线程名字么
threadlocal有跨线程池上下文丢失情况,查看是否存在跨线程池的情况
调试执行 Thread.currentThread()
看到都是同一个线程对象
下图,在 Filter 里面调试的内容
下图,在 Controller 里面调试的内容
是不是环境里面存在多个 AopAspect.class
,对应的 class loader 是不一样的
Dubbo 的 Filter 默认是使用 Dubbo 的 classloader 加载的
有且只有一个 AopAspect.class
在两边分别执行 System.identityHashCode(AopAspect.LISTS)
看下结果是不是一样呢
log.warn("调试 Dubbo 问题 HashCode: {}", System.identityHashCode(DataScopeAop.DATA_SCOPE_LIST));
执行打印日志截图
log.warn("调试 Dubbo 问题 HashCode: {}", System.identityHashCode(DataScopeAop.DATA_SCOPE_LIST));
执行打印日志截图
如果这两个对象不一样就意味着环境里面有两个 DataScopeAop 类
最开始的截图就能看出来,两个类的id不一样,一个是22718,一个是7773,说明不是一个类,存在两个不同cl加载的Aop类,导致LISTS静态对象也不是一个。 可以把这两个类的classloader也打印一下。
在 Controller 获取 AOP 的 classloader
在过滤器中获取 AOP 的 classloader
那这个应该需要你去处理类加载器的差异,Dubbo 只能通过 TCCL 去加载你的类
RestartClassLoader... 把 spring-boot-devtools 去掉,或者参考官方文档进行一些自定义?
No news is good news. Please feel free to create a new issue if you have any question.
Ask your question here
Dubbo版本:
org.apache.dubbo:dubbo-bom:3.2.5
SpringBoot:3.1.2根据 https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/spi/description/filter/ 文档,在使用拦截器时,无法获取 AopAspect 类中 ThreadLocal 数据,经过调试发现:
在 Controller 中 与在 Filter 中,两个
AopAspect.class
不是一个对象,两个AopAspect.LISTS
不是同一个 ThreadLocal 对象,导致在 Filter 中无法获取到数据。在
META-INF/dubbo/org.apache.dubbo.rpc.Filter
文本文件中增加