You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by "SuperDubbo (GitHub)" <gi...@apache.org> on 2018/09/27 10:59:13 UTC
[GitHub] [incubator-dubbo] SuperDubbo commented on issue #2546:
Consumer Node Not destroy
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.
[ Full content available at: https://github.com/apache/incubator-dubbo/issues/2546 ]
This message was relayed via gitbox.apache.org for notifications@dubbo.apache.org