From bfa46f59eb0054f86e6326f92a1c69cc40eeb58e Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Fri, 1 Sep 2023 13:32:19 +0800 Subject: [PATCH] Ignore start if scope model is LifeCycleManagedExternally (#12985) --- .../apache/dubbo/config/ReferenceConfig.java | 9 +++++-- .../apache/dubbo/config/ServiceConfig.java | 9 +++++-- .../dubbo/config/spring/ReferenceBean.java | 11 ++++++-- .../DubboConfigApplicationListener.java | 25 +++++++++++-------- .../reference/ReferenceBeanManager.java | 2 +- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java index f3284c16c6..ac67102c68 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java @@ -227,8 +227,13 @@ public class ReferenceConfig extends ReferenceConfigBase { } if (ref == null) { - // ensure start module, compatible with old api usage - getScopeModel().getDeployer().start(); + if (getScopeModel().isLifeCycleManagedExternally()) { + // prepare model for reference + getScopeModel().getDeployer().prepare(); + } else { + // ensure start module, compatible with old api usage + getScopeModel().getDeployer().start(); + } init(check); } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 2c8d39c4f1..7d14934057 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -295,8 +295,13 @@ public class ServiceConfig extends ServiceConfigBase { return; } - // ensure start module, compatible with old api usage - getScopeModel().getDeployer().start(); + if (getScopeModel().isLifeCycleManagedExternally()) { + // prepare model for reference + getScopeModel().getDeployer().prepare(); + } else { + // ensure start module, compatible with old api usage + getScopeModel().getDeployer().start(); + } synchronized (this) { if (this.exported) { diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java index 46e91f61f3..30790d3fd8 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java @@ -24,6 +24,7 @@ import org.apache.dubbo.common.utils.Assert; import org.apache.dubbo.common.utils.ClassUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.ReferenceConfig; +import org.apache.dubbo.config.spring.context.DubboConfigApplicationListener; import org.apache.dubbo.config.spring.context.DubboConfigBeanInitializer; import org.apache.dubbo.config.spring.reference.ReferenceAttributes; import org.apache.dubbo.config.spring.reference.ReferenceBeanManager; @@ -53,6 +54,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_DUBBO_BEAN_INITIALIZER; import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROXY_FAILED; @@ -143,6 +145,9 @@ public class ReferenceBean implements FactoryBean, //actual reference config private ReferenceConfig referenceConfig; + // ReferenceBeanManager + private ReferenceBeanManager referenceBeanManager; + // Registration sources of this reference, may be xml file or annotation location private List> sources = new ArrayList<>(); @@ -251,7 +256,7 @@ public class ReferenceBean implements FactoryBean, } Assert.notNull(this.interfaceName, "The interface name of ReferenceBean is not initialized"); - ReferenceBeanManager referenceBeanManager = beanFactory.getBean(ReferenceBeanManager.BEAN_NAME, ReferenceBeanManager.class); + this.referenceBeanManager = beanFactory.getBean(ReferenceBeanManager.BEAN_NAME, ReferenceBeanManager.class); referenceBeanManager.addReference(this); } @@ -387,7 +392,9 @@ public class ReferenceBean implements FactoryBean, private Object getCallProxy() throws Exception { if (referenceConfig == null) { - throw new IllegalStateException("ReferenceBean is not ready yet, please make sure to call reference interface method after dubbo is started."); + referenceBeanManager.initReferenceBean(this); + applicationContext.getBean(DubboConfigApplicationListener.class.getName(), DubboConfigApplicationListener.class).init(); + logger.warn(CONFIG_DUBBO_BEAN_INITIALIZER, "", "", "ReferenceBean is not ready yet, please make sure to call reference interface method after dubbo is started."); } //get reference proxy //Subclasses should synchronize on the given Object if they perform any sort of extended singleton creation phase. diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java index 17343637bb..2cdf512053 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java @@ -16,21 +16,22 @@ */ package org.apache.dubbo.config.spring.context; -import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_DUBBO_BEAN_NOT_FOUND; -import static org.springframework.util.ObjectUtils.nullSafeEquals; - -import java.util.concurrent.atomic.AtomicBoolean; - import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent; import org.apache.dubbo.config.spring.util.DubboBeanUtils; import org.apache.dubbo.rpc.model.ModuleModel; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_DUBBO_BEAN_NOT_FOUND; +import static org.springframework.util.ObjectUtils.nullSafeEquals; + /** * An ApplicationListener to load config beans */ @@ -53,11 +54,15 @@ public class DubboConfigApplicationListener implements ApplicationListener