sofastack / sofa-boot

SOFABoot is a framework that enhances Spring Boot and fully compatible with it, provides readiness check, class isolation, etc.
https://www.sofastack.tech/sofa-boot/docs/Home
Apache License 2.0
4.95k stars 1.26k forks source link

sofa isle多模块集成dubbo3报错:No bean named 'referenceAnnotationBeanPostProcessor' available #998

Closed wujun27 closed 2 years ago

wujun27 commented 2 years ago

Describe the bug

我的项目结构: uims-service: 业务能力模块项目, 集成了runtime-sofa-boot-starter并暴露了jvm的sofa service. `

</sofa:service>

<sofa:service ref="roleFacadeService" interface="com.my.uims2.client.service.RoleFacadeService">
    <sofa:binding.jvm/>
</sofa:service>

`

uims-application module 是启动模块,依赖了isle-sofa-boot-starter,dubbo 和uims-service, 配置了dubbo provider把uims-service的sofa service 注册成dubbo provider. `

<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20890"/>

<dubbo:consumer check="false" />

<!-- 在此声明需要暴露的服务接口 -->
<dubbo:service interface="com.my.uims2.client.service.UserFacadeService" ref="userFacadeService2" timeout="1000"/>
<dubbo:service interface="com.my.uims2.client.service.RoleFacadeService" ref="roleFacadeService" timeout="1000"/>

`

项目启动的时候, uims-service刷新spring上下文报错: 022-07-05 14:04:45.362 ERROR 2277 --- [y.uims2.service] com.alipay.sofa : SOFA-BOOT-01-11002: Refreshing Spring Application Context of module com.my.uims2.service got an error org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'referenceAnnotationBeanPostProcessor' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:872) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1344) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:309) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:283) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) at org.apache.dubbo.config.spring.context.DubboInfraBeanRegisterPostProcessor.postProcessBeanFactory(DubboInfraBeanRegisterPostProcessor.java:68) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:325) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:147) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) at com.alipay.sofa.isle.stage.SpringContextInstallStage.doRefreshSpringContext(SpringContextInstallStage.java:313) at com.alipay.sofa.isle.stage.SpringContextInstallStage$1.run(SpringContextInstallStage.java:278) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at com.alipay.sofa.common.thread.ExecutingRunnable.run(ExecutingRunnable.java:84) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)

dubbo的referenceAnnotationBeanPostProcessor 在sofa模块和root spring上下文都没有找到。

将dubbo3.0 版本回退到dubbo2.8.5是成功的。 是不是sofa boot 集成dubbo3.0 有什么问题?

Additional context

项目依赖: uims-service-dependency-tree.log uims-application-dependency-tree.log

wujun27 commented 2 years ago

日志设置为DEBUG,发现sofa module再启动module spring上下文前ReferenceAnnotationBeanPostProcessor的bean被销毁了,导致Root Spring上下文里找不到这个bean。 class org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor was destroying!

2022-07-06 10:04:36.876 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'referenceAnnotationBeanPostProcessor' 2022-07-06 10:04:36.878 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'dubboReferenceBeanManager' 2022-07-06 10:04:36.918 DEBUG 10150 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Found key 'spring.application.name' in PropertySource 'configurationProperties' with value of type String 2022-07-06 10:04:36.918 DEBUG 10150 --- [ main] o.s.c.e.PropertySourcesPropertyResolver : Found key 'spring.application.name' in PropertySource 'environmentProperties' with value of type String 2022-07-06 10:04:37.336 INFO 10150 --- [ main] f.a.ReferenceAnnotationBeanPostProcessor : class org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor was destroying! 2022-07-06 10:04:37.336 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor' 2022-07-06 10:04:37.339 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'preserveErrorControllerTargetClassPostProcessor' 2022-07-06 10:04:37.342 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'cn.hutool.extra.spring.SpringUtil' 2022-07-06 10:04:37.346 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'sofaModuleBeanFactoryPostProcessor' 2022-07-06 10:04:37.348 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'sofaModulePostProcessorShareManager' 2022-07-06 10:04:37.348 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'com.alipay.sofa.boot.autoconfigure.isle.SofaModuleAutoConfiguration' 2022-07-06 10:04:37.349 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Autowiring by type from bean name 'sofaModulePostProcessorShareManager' via factory method to bean named 'org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2a3c96e3' 2022-07-06 10:04:37.351 DEBUG 10150 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Autowiring by type from bean name 'sofaModuleBeanFactoryPostProcessor' via factory method to bean named 'sofaModulePostProcessorShareManager'

wujun27 commented 2 years ago

找到原因: ReferenceAnnotationBeanPostProcessor postProcessBeanFactory 处理完会清理掉自己。

org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor if (beanFactory instanceof AbstractBeanFactory) { List beanPostProcessors = ((AbstractBeanFactory) beanFactory).getBeanPostProcessors(); for (BeanPostProcessor beanPostProcessor : beanPostProcessors) { if (beanPostProcessor == this) { // This bean has been registered as BeanPostProcessor at org.apache.dubbo.config.spring.context.DubboInfraBeanRegisterPostProcessor.postProcessBeanFactory() // so destroy this bean here, prevent register it as BeanPostProcessor again, avoid cause BeanPostProcessorChecker detection error beanDefinitionRegistry.removeBeanDefinition(BEAN_NAME); break; } } }

if (beanFactory instanceof AbstractBeanFactory) { List beanPostProcessors = ((AbstractBeanFactory) beanFactory).getBeanPostProcessors(); for (BeanPostProcessor beanPostProcessor : beanPostProcessors) { if (beanPostProcessor == this) { // This bean has been registered as BeanPostProcessor at org.apache.dubbo.config.spring.context.DubboInfraBeanRegisterPostProcessor.postProcessBeanFactory() // so destroy this bean here, prevent register it as BeanPostProcessor again, avoid cause BeanPostProcessorChecker detection error beanDefinitionRegistry.removeBeanDefinition(BEAN_NAME); break; } } }

wujun27 commented 2 years ago

感觉是dubbo的问题,本身没问题,但是在sofa 多模块Spring上下会触发这个bug

wujun27 commented 2 years ago

dubbo3 修复掉这段逻辑以后就ok了。 关闭这个issue,我提交到dubbo去