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) {