diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java index 6d69e1467..ccbfc68c8 100644 --- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java +++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java @@ -17,11 +17,13 @@ package org.apache.dubbo.admin.registry.mapping; +import org.apache.dubbo.common.ProtocolServiceKey; import org.apache.dubbo.common.URL; import org.apache.dubbo.registry.client.ServiceDiscovery; import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,7 +34,7 @@ public class AdminServiceInstancesChangedListener extends ServiceInstancesChange private AddressChangeListener addressChangeListener; - private Map> oldServiceUrls; + private Map> oldServiceUrls; public AdminServiceInstancesChangedListener(Set serviceNames, ServiceDiscovery serviceDiscovery, AddressChangeListener addressChangeListener) { super(serviceNames, serviceDiscovery); @@ -41,12 +43,18 @@ public AdminServiceInstancesChangedListener(Set serviceNames, ServiceDis } protected void notifyAddressChanged() { + Map> protocolServiceUrls = serviceUrls.values().stream() + .flatMap(Collection::stream) + .collect(Collectors.groupingBy(ProtocolServiceKeyWithUrls::getProtocolServiceKey)); + oldServiceUrls.keySet().stream() - .filter(protocolServiceKey -> !serviceUrls.containsKey(protocolServiceKey)) - .forEach(protocolServiceKey -> addressChangeListener.notifyAddressChanged(protocolServiceKey, new ArrayList<>())); - serviceUrls.forEach((protocolServiceKey, urls) -> addressChangeListener.notifyAddressChanged(protocolServiceKey, extractUrls(urls))); + .filter(protocolServiceKey -> !protocolServiceUrls.containsKey(protocolServiceKey)) + .forEach(protocolServiceKey -> addressChangeListener.notifyAddressChanged(protocolServiceKey.toString(), new ArrayList<>())); + + protocolServiceUrls + .forEach((protocolServiceKey, urls) -> addressChangeListener.notifyAddressChanged(protocolServiceKey.toString(), extractUrls(urls))); - oldServiceUrls = serviceUrls; + oldServiceUrls = protocolServiceUrls; } private List extractUrls(List keyUrls) {