This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch dev-metadata in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
commit 22599b9e9b00997ecdc06ad7719e8fa054944a93 Author: ken.lj <ken.lj...@gmail.com> AuthorDate: Wed Nov 7 10:04:08 2018 +0800 Make ReferenceBean depend on ConfigCenterBean, so that ConfigCenterBean can always be initialized before refer. --- .../apache/dubbo/config/ConfigCenterConfig.java | 37 +++++++++++++++++++++- .../dubbo/config/spring/ConfigCenterBean.java | 35 +++++++++++++++++++- .../apache/dubbo/config/spring/ReferenceBean.java | 4 +++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java index d454caf..50b7699 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java @@ -49,6 +49,9 @@ public class ConfigCenterConfig extends AbstractConfig { private String appname; private String configfile = "dubbo.properties"; + private String localconfigfile; + + private ApplicationConfig application; // customized parameters private Map<String, String> parameters; @@ -86,7 +89,11 @@ public class ConfigCenterConfig extends AbstractConfig { Environment.getInstance().setDynamicConfiguration(dynamicConfiguration); String configContent = dynamicConfiguration.getConfig(configfile, group); - String appConfigContent = dynamicConfiguration.getConfig(configfile, appname); + String appConfigContent = dynamicConfiguration.getConfig + ( + StringUtils.isNotEmpty(localconfigfile) ? localconfigfile : configfile, + getApplicationName() + ); try { Environment.getInstance().setConfigCenterFirst(priority); Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent)); @@ -96,6 +103,17 @@ public class ConfigCenterConfig extends AbstractConfig { } } + private String getApplicationName() { + if (application != null) { + if (!application.isValid()) { + throw new IllegalStateException( + "No application config found or it's not a valid config! Please add <dubbo:application name=\"...\" /> to your spring config."); + } + return application.getName(); + } + return appname; + } + private Map<String, String> parseProperties(String content) throws IOException { Map<String, String> map = new HashMap<>(); if (content == null) { @@ -216,6 +234,15 @@ public class ConfigCenterConfig extends AbstractConfig { this.configfile = configfile; } + @Parameter(excluded = true) + public String getLocalconfigfile() { + return localconfigfile; + } + + public void setLocalconfigfile(String localconfigfile) { + this.localconfigfile = localconfigfile; + } + @Parameter(key = Constants.CONFIG_APPNAME_KEY) public String getAppname() { return appname; @@ -233,4 +260,12 @@ public class ConfigCenterConfig extends AbstractConfig { checkParameterName(parameters); this.parameters = parameters; } + + public ApplicationConfig getApplication() { + return application; + } + + public void setApplication(ApplicationConfig application) { + this.application = application; + } } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java index b8754a2..aa88eaf 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java @@ -16,9 +16,16 @@ */ package org.apache.dubbo.config.spring; +import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ConfigCenterConfig; +import org.apache.dubbo.config.spring.extension.SpringExtensionFactory; +import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import java.util.Map; /** * Since 2.7.0+, export and refer will only be executed when Spring is fully initialized, and each Config bean will get refreshed on the start of the export and refer process. @@ -26,10 +33,36 @@ import org.springframework.beans.factory.InitializingBean; * * If use ConfigCenterConfig directly, you should make sure ConfigCenterConfig.init() is called before actually export/refer any Dubbo service. */ -public class ConfigCenterBean extends ConfigCenterConfig implements InitializingBean, DisposableBean { +public class ConfigCenterBean extends ConfigCenterConfig implements InitializingBean, ApplicationContextAware, DisposableBean { + + private transient ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + SpringExtensionFactory.addApplicationContext(applicationContext); + } @Override public void afterPropertiesSet() throws Exception { + if (getApplication() == null) { + Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false); + if (applicationConfigMap != null && applicationConfigMap.size() > 0) { + ApplicationConfig applicationConfig = null; + for (ApplicationConfig config : applicationConfigMap.values()) { + if (config.isDefault() == null || config.isDefault()) { + if (applicationConfig != null) { + throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config); + } + applicationConfig = config; + } + } + if (applicationConfig != null) { + setApplication(applicationConfig); + } + } + } + this.init(); } 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 07b7b2f..565b33f 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 @@ -79,6 +79,10 @@ public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, @Override @SuppressWarnings({"unchecked"}) public void afterPropertiesSet() throws Exception { + if (applicationContext != null) { + BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ConfigCenterBean.class, false, false); + } + if (getConsumer() == null) { Map<String, ConsumerConfig> consumerConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ConsumerConfig.class, false, false); if (consumerConfigMap != null && consumerConfigMap.size() > 0) {