You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/11/07 02:06:53 UTC

[incubator-dubbo] 02/03: Make ReferenceBean depend on ConfigCenterBean, so that ConfigCenterBean can always be initialized before refer.

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 <ke...@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) {