This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch 3.0 in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 838dfd6eda89e15887244f8ac69ffe6fb6123170 Author: ken.lj <[email protected]> AuthorDate: Tue Jul 7 11:43:17 2020 +0800 metadata report status --- .../org/apache/dubbo/metadata/MetadataInfo.java | 35 ++++++++++++++++------ .../metadata/store/RemoteMetadataServiceImpl.java | 16 +++++----- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java index 932517d..73e736f 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicBoolean; import static org.apache.dubbo.common.constants.CommonConstants.DOT_SEPARATOR; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPERATOR; @@ -43,6 +44,7 @@ public class MetadataInfo implements Serializable { private Map<String, ServiceInfo> services; private transient Map<String, String> extendParams; + private transient AtomicBoolean reported = new AtomicBoolean(false); public MetadataInfo(String app) { this(app, null, null); @@ -60,6 +62,7 @@ public class MetadataInfo implements Serializable { return; } this.services.put(serviceInfo.getMatchKey(), serviceInfo); + markChanged(); } public void removeService(ServiceInfo serviceInfo) { @@ -67,6 +70,7 @@ public class MetadataInfo implements Serializable { return; } this.services.remove(serviceInfo.getMatchKey()); + markChanged(); } public void removeService(String key) { @@ -74,18 +78,11 @@ public class MetadataInfo implements Serializable { return; } this.services.remove(key); - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; + markChanged(); } public String getRevision() { - if (revision != null) { + if (revision != null && hasReported()) { return revision; } StringBuilder sb = new StringBuilder(); @@ -101,6 +98,26 @@ public class MetadataInfo implements Serializable { this.revision = revision; } + public boolean hasReported() { + return reported.get(); + } + + public void markReported() { + reported.compareAndSet(false, true); + } + + public void markChanged() { + reported.compareAndSet(true, false); + } + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + public Map<String, ServiceInfo> getServices() { return services; } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java index 85d6855..ee41050 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java @@ -62,14 +62,16 @@ public class RemoteMetadataServiceImpl { public void publishMetadata(ServiceInstance instance) { Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos(); metadataInfos.forEach((registryKey, metadataInfo) -> { - SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(), metadataInfo.getRevision()); - metadataInfo.getRevision(); - metadataInfo.getExtendParams().put(REGISTRY_KEY, registryKey); - MetadataReport metadataReport = getMetadataReports().get(registryKey); - if (metadataReport == null) { - metadataReport = getMetadataReports().entrySet().iterator().next().getValue(); + if (!metadataInfo.hasReported()) { + SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(), metadataInfo.getRevision()); + metadataInfo.getRevision(); + metadataInfo.getExtendParams().put(REGISTRY_KEY, registryKey); + MetadataReport metadataReport = getMetadataReports().get(registryKey); + if (metadataReport == null) { + metadataReport = getMetadataReports().entrySet().iterator().next().getValue(); + } + metadataReport.publishAppMetadata(identifier, metadataInfo); } - metadataReport.publishAppMetadata(identifier, metadataInfo); }); }
