SuperDubbo commented on issue #2546: Consumer Node Not destroy
URL: 
https://github.com/apache/incubator-dubbo/issues/2546#issuecomment-425048796
 
 
   I have review the code,and run the testcase,when ReferenceConfig is in 
destroy,the consumer node in Zookeeper will be removed too.
   please see the code :
   **org.apache.dubbo.registry.integration.RegistryDirectory#destroy**
   ```java
       @Override
       public void destroy() {
           if (isDestroyed()) {
               return;
           }
           // unsubscribe.
           try {
               if (getConsumerUrl() != null && registry != null && 
registry.isAvailable()) {
                   registry.unsubscribe(getConsumerUrl(), this);
               }
           } catch (Throwable t) {
               logger.warn("unexpected error when unsubscribe service " + 
serviceKey + "from registry" + registry.getUrl(), t);
           }
           super.destroy(); // must be executed after unsubscribing
           try {
               destroyAllInvokers();
           } catch (Throwable t) {
               logger.warn("Failed to destroy service " + serviceKey, t);
           }
       }
   ```
   
   the code "registry.unsubscribe(getConsumerUrl(), this);" will call 
org.apache.dubbo.registry.support.FailbackRegistry#unsubscribe
   ```java
       @Override
       public void unsubscribe(URL url, NotifyListener listener) {
           super.unsubscribe(url, listener);
           removeFailedSubscribed(url, listener);
           try {
               // Sending a canceling subscription request to the server side
               doUnsubscribe(url, listener);
           } catch (Exception e) {
               Throwable t = e;
   
               // If the startup detection is opened, the Exception is thrown 
directly.
               boolean check = getUrl().getParameter(Constants.CHECK_KEY, true)
                       && url.getParameter(Constants.CHECK_KEY, true);
               boolean skipFailback = t instanceof SkipFailbackWrapperException;
               if (check || skipFailback) {
                   if (skipFailback) {
                       t = t.getCause();
                   }
                   throw new IllegalStateException("Failed to unsubscribe " + 
url + " to registry " + getUrl().getAddress() + ", cause: " + t.getMessage(), 
t);
               } else {
                   logger.error("Failed to unsubscribe " + url + ", waiting for 
retry, cause: " + t.getMessage(), t);
               }
   
               // Record a failed registration request to a failed list, retry 
regularly
               Set<NotifyListener> listeners = failedUnsubscribed.get(url);
               if (listeners == null) {
                   failedUnsubscribed.putIfAbsent(url, new 
ConcurrentHashSet<NotifyListener>());
                   listeners = failedUnsubscribed.get(url);
               }
               listeners.add(listener);
           }
       }
   ```
   the code "doUnsubscribe(url, listener);" will call 
org.apache.dubbo.registry.zookeeper.ZookeeperRegistry#doUnsubscribe
   ````java
       @Override
       protected void doUnsubscribe(URL url, NotifyListener listener) {
           ConcurrentMap<NotifyListener, ChildListener> listeners = 
zkListeners.get(url);
           if (listeners != null) {
               ChildListener zkListener = listeners.get(listener);
               if (zkListener != null) {
                   if (Constants.ANY_VALUE.equals(url.getServiceInterface())) {
                       String root = toRootPath();
                       zkClient.removeChildListener(root, zkListener);
                   } else {
                       for (String path : toCategoriesPath(url)) {
                           zkClient.removeChildListener(path, zkListener);
                       }
                   }
               }
           }
       }
   ````
   it's here will remove the consumer node when ReferenceConfig is in destroy.
   @GodIsDevil  it's no problem.
   @ralf0131 there is no problem,please close the issus.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to