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

liujun pushed a commit to branch 3.0-metadata-refactor
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 2b0a44227b93767b553886f41754b744046fc399
Author: ken.lj <[email protected]>
AuthorDate: Thu Dec 2 17:00:26 2021 +0800

    fix, dynamic configuration close & ServiceDiscoveryRegistry
---
 .../config/configcenter/wrapper/CompositeDynamicConfiguration.java  | 2 +-
 .../org/apache/dubbo/registry/client/AbstractServiceDiscovery.java  | 5 +++++
 .../org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java  | 6 +-----
 .../java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java | 4 ++++
 .../apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java  | 4 ++++
 5 files changed, 15 insertions(+), 6 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
index a2e8dea..a345ad4 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
@@ -97,7 +97,7 @@ public class CompositeDynamicConfiguration implements 
DynamicConfiguration {
             try {
                 configuration.close();
             } catch (Exception e) {
-                logger.warn("close dynamic configuration failed: " + 
e.getMessage(), e);
+                logger.warn("close dynamic configuration " + 
configuration.getClass().getName() + "failed: " + e.getMessage(), e);
             }
         }
         configurations.clear();
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
index e86a6c6..dab0e03 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
@@ -19,17 +19,20 @@ package org.apache.dubbo.registry.client;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashSet;
 import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import 
org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.registry.NotifyListener;
+import 
org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;
 import org.apache.dubbo.registry.client.metadata.MetadataUtils;
 import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
 import org.apache.dubbo.registry.client.metadata.store.MetaCacheManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.List;
+import java.util.Set;
 
 import static 
org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;
 import static org.apache.dubbo.metadata.RevisionResolver.EMPTY_REVISION;
@@ -52,6 +55,8 @@ public abstract class AbstractServiceDiscovery implements 
ServiceDiscovery {
     protected MetaCacheManager metaCacheManager;
     protected URL registryURL;
 
+    protected Set<ServiceInstancesChangedListener> instanceListeners = new 
ConcurrentHashSet<>();
+
     protected ApplicationModel applicationModel;
 
     public AbstractServiceDiscovery(ApplicationModel applicationModel, URL 
registryURL) {
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
index 551fd55..40b4ef8 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
@@ -286,7 +286,6 @@ public class ServiceDiscoveryRegistry extends 
FailbackRegistry {
         String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR 
+ url.getParameter(PROTOCOL_KEY, DUBBO);
 
         // register ServiceInstancesChangedListener
-        boolean serviceListenerRegistered = true;
         ServiceInstancesChangedListener serviceInstancesChangedListener;
         synchronized (this) {
             serviceInstancesChangedListener = 
serviceListeners.get(serviceNamesKey);
@@ -299,7 +298,6 @@ public class ServiceDiscoveryRegistry extends 
FailbackRegistry {
                         serviceInstancesChangedListener.onEvent(new 
ServiceInstancesChangedEvent(serviceName, serviceInstances));
                     }
                 }
-                serviceListenerRegistered = false;
                 serviceListeners.put(serviceNamesKey, 
serviceInstancesChangedListener);
             }
         }
@@ -307,9 +305,7 @@ public class ServiceDiscoveryRegistry extends 
FailbackRegistry {
         serviceInstancesChangedListener.setUrl(url);
         listener.addServiceListener(serviceInstancesChangedListener);
         
serviceInstancesChangedListener.addListenerAndNotify(protocolServiceKey, 
listener);
-        if (!serviceListenerRegistered) {
-            
serviceDiscovery.addServiceInstancesChangedListener(serviceInstancesChangedListener);
-        }
+        
serviceDiscovery.addServiceInstancesChangedListener(serviceInstancesChangedListener);
     }
 
     /**
diff --git 
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
 
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
index bd020fc..1bf83cc 100644
--- 
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
+++ 
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
@@ -110,6 +110,10 @@ public class NacosServiceDiscovery extends 
AbstractServiceDiscovery {
     @Override
     public void 
addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)
         throws NullPointerException, IllegalArgumentException {
+        // check if listener has already been added through another 
interface/service
+        if (!instanceListeners.add(listener)) {
+            return;
+        }
         execute(namingService, service -> 
listener.getServiceNames().forEach(serviceName -> {
             try {
                 service.subscribe(serviceName, Constants.DEFAULT_GROUP, e -> { 
// Register Nacos EventListener
diff --git 
a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java
 
b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java
index 59099e4..6d2f438 100644
--- 
a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java
+++ 
b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java
@@ -113,6 +113,10 @@ public class ZookeeperServiceDiscovery extends 
AbstractServiceDiscovery {
     @Override
     public void 
addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)
         throws NullPointerException, IllegalArgumentException {
+        // check if listener has already been added through another 
interface/service
+        if (!instanceListeners.add(listener)) {
+            return;
+        }
         listener.getServiceNames().forEach(serviceName -> 
registerServiceWatcher(serviceName, listener));
     }
 

Reply via email to