diff --git a/dubbo-config/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java b/dubbo-config/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java index 6e292cfa559242b49411117c5642f4a6ba6177fc..ba9e06c1c309c739c13031043962fde04a4e5222 100644 --- a/dubbo-config/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java +++ b/dubbo-config/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java @@ -124,18 +124,18 @@ public abstract class AbstractConfig implements Serializable { } else { String str = String.valueOf(value).trim(); if (value != null && str.length() > 0) { - if (prefix != null && prefix.length() > 0) { - key = prefix + "." + key; - } if (parameter != null && parameter.escaped()) { str = URL.encode(str); } if (parameter != null && parameter.append()) { - String pre = (String)parameters.get(key); + String pre = (String)parameters.get(Constants.DEFAULT_KEY + "." + key); if (pre != null && pre.length() > 0) { str = pre + "," + str; } } + if (prefix != null && prefix.length() > 0) { + key = prefix + "." + key; + } parameters.put(key, str); } else if (parameter != null && parameter.required()) { throw new IllegalStateException(config.getClass().getSimpleName() + "." + key + " == null"); diff --git a/dubbo-config/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java b/dubbo-config/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java index 55925b98f134cd69849c36eb87a30176cf0447ec..5c896dd1f88e8d7ac0c868f4ecdab4c0de0cfa0f 100644 --- a/dubbo-config/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java @@ -93,7 +93,13 @@ public class ReferenceConfig extends AbstractConsumerConfig { private transient boolean initialized; private transient boolean destroyed; + + private final List urls = new ArrayList(); + public List toUrls() { + return urls; + } + public synchronized T get() { if (destroyed){ throw new IllegalStateException("Already destroyed!"); @@ -106,7 +112,7 @@ public class ReferenceConfig extends AbstractConsumerConfig { public synchronized void destroy() { if (ref == null) { - throw new IllegalStateException("Uninitialized."); + return; } if (destroyed){ return; @@ -276,7 +282,6 @@ public class ReferenceConfig extends AbstractConsumerConfig { logger.info("Using injvm service " + interfaceClass.getName()); } } else { - List urls = new ArrayList(); if (url != null && url.length() > 0) { // 用户指定URL,指定的URL可能是对点对直连地址,也可能是注册中心URL String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url); if (us != null && us.length > 0) { diff --git a/dubbo-config/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java b/dubbo-config/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java index 8c1c11e7475a5e240266e01cc11c3070e489aca5..485c5097b8b68d4c95d9e6b1f409ef824d737d98 100644 --- a/dubbo-config/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java +++ b/dubbo-config/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java @@ -85,11 +85,10 @@ public class ServiceConfig extends AbstractServiceConfig { private transient boolean generic; - @Parameter(excluded = true) - public boolean isExported() { - return exported; + public List toUrls() { + return urls; } - + public synchronized void export() { if (delay != null && delay > 0) { Thread thread = new Thread(new Runnable() { @@ -251,8 +250,8 @@ public class ServiceConfig extends AbstractServiceConfig { } public synchronized void unexport() { - if (!exported) { - throw new IllegalStateException("No exported!"); + if (! exported) { + return; } if (unexported) { return; @@ -328,7 +327,7 @@ public class ServiceConfig extends AbstractServiceConfig { } map.put("dubbo", Version.getVersion()); appendParameters(map, application); - appendParameters(map, provider); + appendParameters(map, provider, Constants.DEFAULT_KEY); appendParameters(map, protocolConfig); appendParameters(map, this); map.put("prompt", "dubbo"); diff --git a/dubbo-config/src/test/java/com/alibaba/dubbo/config/ConfigTest.java b/dubbo-config/src/test/java/com/alibaba/dubbo/config/ConfigTest.java index 0d7e285a1146436fb2b8f77c42b7c1ecae3d9013..768936ca9750ca3e94e31a9fd95082ff154a153b 100644 --- a/dubbo-config/src/test/java/com/alibaba/dubbo/config/ConfigTest.java +++ b/dubbo-config/src/test/java/com/alibaba/dubbo/config/ConfigTest.java @@ -26,6 +26,7 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.utils.NetUtils; import com.alibaba.dubbo.config.api.DemoService; +import com.alibaba.dubbo.config.provider.impl.DemoServiceImpl; import com.alibaba.dubbo.registry.RegistryService; import com.alibaba.dubbo.registry.support.SimpleRegistryExporter; import com.alibaba.dubbo.registry.support.SimpleRegistryService; @@ -174,5 +175,46 @@ public class ConfigTest { consumer.setTimeout(2000); Assert.assertEquals("1000", System.getProperty("sun.rmi.transport.tcp.responseTimeout")); } + + @Test + public void testAppendFilter() throws Exception { + ProviderConfig provider = new ProviderConfig(); + provider.setFilter("classloader,monitor"); + ServiceConfig service = new ServiceConfig(); + service.setFilter("accesslog,trace"); + service.setProvider(provider); + service.setApplication(new ApplicationConfig("provider")); + service.setRegistry(new RegistryConfig(RegistryConfig.NO_AVAILABLE)); + service.setInterface(DemoService.class); + service.setRef(new DemoServiceImpl()); + try { + service.export(); + List urls = service.toUrls(); + Assert.assertNotNull(urls); + Assert.assertEquals(1, urls.size()); + Assert.assertEquals("classloader,monitor,accesslog,trace", urls.get(0).getParameter("service.filter")); + + ConsumerConfig consumer = new ConsumerConfig(); + consumer.setFilter("classloader,monitor"); + ReferenceConfig reference = new ReferenceConfig(); + reference.setFilter("accesslog,trace"); + reference.setConsumer(consumer); + reference.setApplication(new ApplicationConfig("consumer")); + reference.setRegistry(new RegistryConfig(RegistryConfig.NO_AVAILABLE)); + reference.setInterface(DemoService.class); + reference.setUrl("dubbo://" + NetUtils.getLocalHost() + ":20880?" + DemoService.class.getName() + "?check=false"); + try { + reference.get(); + urls = reference.toUrls(); + Assert.assertNotNull(urls); + Assert.assertEquals(1, urls.size()); + Assert.assertEquals("classloader,monitor,accesslog,trace", urls.get(0).getParameter("reference.filter")); + } finally { + reference.destroy(); + } + } finally { + service.unexport(); + } + } } \ No newline at end of file