fixes #10541, save subscribed dataIds for unsubscription. (#10573)
diff --git a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java
index 021102c..d2f749c 100644
--- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java
+++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java
@@ -214,6 +214,7 @@
NacosInstanceManageUtil.setCorrespondingServiceNames(serviceName, serviceNames);
}
}
+
doSubscribe(url, nacosAggregateListener, serviceNames);
}
@@ -277,11 +278,18 @@
shutdownServiceNamesLookup();
} else {
Map<NotifyListener, NacosAggregateListener> listenerMap = originToAggregateListener.get(url);
+ if (listenerMap == null) {
+ logger.warn(String.format("No aggregate listener found for url %s, this service might have already been unsubscribed.", url));
+ return;
+ }
NacosAggregateListener nacosAggregateListener = listenerMap.remove(listener);
if (nacosAggregateListener != null) {
- Set<String> serviceNames = getServiceNames(url, nacosAggregateListener);
+ Set<String> serviceNames = nacosAggregateListener.getServiceNames();
try {
doUnsubscribe(url, nacosAggregateListener, serviceNames);
+ for (String serviceName : serviceNames) {
+ NacosInstanceManageUtil.removeCorrespondingServiceNames(serviceName);
+ }
} catch (NacosException e) {
logger.error("Failed to unsubscribe " + url + " to nacos " + getUrl() + ", cause: " + e.getMessage(), e);
}
diff --git a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java
index cb0179f..125f22a 100644
--- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java
+++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosInstanceManageUtil.java
@@ -52,6 +52,10 @@
SERVICE_INSTANCE_LIST_MAP.put(serviceName, instanceList);
}
+ public static Set<String> removeCorrespondingServiceNames(String serviceName) {
+ return CORRESPONDING_SERVICE_NAMES_MAP.remove(serviceName);
+ }
+
public static List<Instance> getAllCorrespondingServiceInstanceList(String serviceName) {
if (!CORRESPONDING_SERVICE_NAMES_MAP.containsKey(serviceName)) {
return Lists.newArrayList();