Closed sweetcard closed 1 year ago
感谢反馈,可以补充下复现步骤
感谢反馈,可以补充下复现步骤
在代码描述里面比较清楚。看看有没有哪些需要补充的
感谢反馈,可以补充下复现步骤
在代码描述里面比较清楚。看看有没有哪些需要补充的
可以补充个demo吗,附上链接
感谢反馈,可以补充下复现步骤
在代码描述里面比较清楚。看看有没有哪些需要补充的
可以补充个demo吗,附上链接 https://github.com/sweetcard/dptbugdemo
具体原因进一步搞清楚了。 是因为一个Aop Advisor间接依赖于线程池asyncExecutor。导致了该线程池被提升了优先级,提前被初始化了。 Aop的优先级是Ordered.HIGHEST_PRECEDENCE,所以线程池也被提前初始化了。
可能的解决办法:
@yanhom1314 @sweetcard see pr #245
首先感谢您使用 DynamicTp,如果使用过程中有任何问题,请按照下述模板反馈问题,建议使用 Markdown 语法。
版本信息
问题描述
文字描述、截图、粘代码方式
猜测可能原因: 大概原因是asyncExecutor这个线程池被一个构造函数作为依赖提前初始化了。 而在此时DtpPostProcessor还未完成new。当DtpPostProcessor完成初始化后,在进行postProcessAfterInitialization的时候,只能检测到尚未完成初始化的bean。这也是如果再配置一个asyncExecutor2线程池就能被检测出来的原因。 BeanPostProcessor的检测过程可以参看 AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization。 对比下有构造函数依赖和非构造函数依赖就会发现getBeanPostProcessors()反馈的processors不一样。 因为DtpPostProcessor无法检测到asyncExecutor,所以DTP便无法完成注册过程,后续的一些列获取asyncExecutor的方法都会失效。
进一步分析发现,是因为一个Aop Advisor间接依赖于线程池asyncExecutor。导致了该线程池被提升了优先级,提前被初始化了。Aop的优先级是Ordered.HIGHEST_PRECEDENCE,所以线程池也被提前初始化了。
解决办法: 把构造函数的线程池依赖设置为@Lazy或者改为@Resource依赖。 或者将DtpPostProcessor的优先级提到PriorityOrdered(未验证)
复现步骤
其他信息