This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch 2.6.x
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/2.6.x by this push:
     new 54e14e9  Merge pull request #3502, apply #3295 to 2.6 branch.
54e14e9 is described below

commit 54e14e905c0d0e3b2921e6897ccb79afc0050fc5
Author: min <[email protected]>
AuthorDate: Tue Feb 19 15:23:41 2019 +0800

    Merge pull request #3502, apply #3295 to 2.6 branch.
    
    Fixes #3294, referenceconfig#destroy never invoke unregister.
---
 .../registry/integration/RegistryDirectory.java      | 20 ++++++++++++++++++++
 .../dubbo/registry/integration/RegistryProtocol.java | 13 +++++++++++--
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java
index 68ecc0e..d5ae6b8 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java
@@ -78,6 +78,8 @@ public class RegistryDirectory<T> extends 
AbstractDirectory<T> implements Notify
 
     private volatile URL overrideDirectoryUrl; // Initialization at 
construction time, assertion not null, and always assign non null value
 
+    private volatile URL registeredConsumerUrl;
+
     /**
      * override rules
      * Priority: override>-D>consumer>provider
@@ -164,6 +166,16 @@ public class RegistryDirectory<T> extends 
AbstractDirectory<T> implements Notify
         if (isDestroyed()) {
             return;
         }
+
+        // unregister.
+        try {
+            if (getRegisteredConsumerUrl() != null && registry != null && 
registry.isAvailable()) {
+                registry.unregister(getRegisteredConsumerUrl());
+            }
+        } catch (Throwable t) {
+            logger.warn("unexpected error when unregister service " + 
serviceKey + "from registry" + registry.getUrl(), t);
+        }
+
         // unsubscribe.
         try {
             if (getConsumerUrl() != null && registry != null && 
registry.isAvailable()) {
@@ -612,6 +624,14 @@ public class RegistryDirectory<T> extends 
AbstractDirectory<T> implements Notify
         return this.overrideDirectoryUrl;
     }
 
+    public URL getRegisteredConsumerUrl() {
+        return registeredConsumerUrl;
+    }
+
+    public void setRegisteredConsumerUrl(URL registeredConsumerUrl) {
+        this.registeredConsumerUrl = registeredConsumerUrl;
+    }
+
     @Override
     public boolean isAvailable() {
         if (isDestroyed()) {
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 e1a59b9..f8bf2a1 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
@@ -51,6 +51,9 @@ import static 
com.alibaba.dubbo.common.Constants.ACCEPT_FOREIGN_IP;
 import static com.alibaba.dubbo.common.Constants.QOS_ENABLE;
 import static com.alibaba.dubbo.common.Constants.QOS_PORT;
 import static com.alibaba.dubbo.common.Constants.VALIDATION_KEY;
+import static com.alibaba.dubbo.common.Constants.CATEGORY_KEY;
+import static com.alibaba.dubbo.common.Constants.CONSUMERS_CATEGORY;
+import static com.alibaba.dubbo.common.Constants.CHECK_KEY;
 
 /**
  * RegistryProtocol
@@ -300,8 +303,9 @@ public class RegistryProtocol implements Protocol {
         URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, 
parameters.remove(Constants.REGISTER_IP_KEY), 0, type.getName(), parameters);
         if (!Constants.ANY_VALUE.equals(url.getServiceInterface())
                 && url.getParameter(Constants.REGISTER_KEY, true)) {
-            
registry.register(subscribeUrl.addParameters(Constants.CATEGORY_KEY, 
Constants.CONSUMERS_CATEGORY,
-                    Constants.CHECK_KEY, String.valueOf(false)));
+            URL registeredConsumerUrl = getRegisteredConsumerUrl(subscribeUrl, 
url);
+            registry.register(registeredConsumerUrl);
+            directory.setRegisteredConsumerUrl(registeredConsumerUrl);
         }
         directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY,
                 Constants.PROVIDERS_CATEGORY
@@ -313,6 +317,11 @@ public class RegistryProtocol implements Protocol {
         return invoker;
     }
 
+    public URL getRegisteredConsumerUrl(final URL consumerUrl, URL 
registryUrl) {
+        return consumerUrl.addParameters(CATEGORY_KEY, CONSUMERS_CATEGORY,
+                CHECK_KEY, String.valueOf(false));
+    }
+
     @Override
     public void destroy() {
         List<Exporter<?>> exporters = new 
ArrayList<Exporter<?>>(bounds.values());

Reply via email to