diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java index 029e363adfc9de3955c7a90ee5e04d1ee185fdd7..2962fadd8ed71f198fa7f80599d588428413bace 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java @@ -94,7 +94,7 @@ public class RegistryProtocol implements Protocol { //registry provider Registry registry = doRegister(originInvoker); //设置exporter与registry的关系 (for unexport) - exporter.setRegistry(registry); + exporter.addRegistry(registry); //保证每次export都返回一个新的exporter实例 return new Exporter() { public Invoker getInvoker() { @@ -351,7 +351,7 @@ public class RegistryProtocol implements Protocol { private class ExporterChangeableWrapper implements Exporter{ private Exporter exporter; private final Invoker originInvoker; - private Registry registry; + private final List registrys = new ArrayList(); public ExporterChangeableWrapper(Exporter exporter, Invoker originInvoker){ this.exporter = exporter; @@ -370,20 +370,21 @@ public class RegistryProtocol implements Protocol { this.exporter = exporter; } - public void setRegistry(final Registry registry) { - if (this.registry != null){ - logger.warn(new IllegalStateException("registry can not be changed!")); + public void addRegistry(final Registry registry) { + if (registry != null && ! registrys.contains(registry)){ + registrys.add(registry); } - this.registry = registry; } public void unexport() { String key = getCacheKey(this.originInvoker); bounds.remove(key); try { - if (registry != null && registry.isAvailable()) { - registry.unregister(getRegistedProviderUrl(originInvoker)); - } + for (Registry registry: registrys) { + if (registry != null && registry.isAvailable()) { + registry.unregister(getRegistedProviderUrl(originInvoker)); + } + } } finally { exporter.unexport(); }