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

zhangzicheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 1b08ed0eb [ISSUE #4686] ZookeeperClientRegisterRepository active 
offline (#4806)
1b08ed0eb is described below

commit 1b08ed0ebc669a7ded2c1983462bf0da0ffc1396
Author: xuziyang <[email protected]>
AuthorDate: Fri Jul 7 10:07:21 2023 +0800

    [ISSUE #4686] ZookeeperClientRegisterRepository active offline (#4806)
    
    Co-authored-by: dragon-zhang <[email protected]>
    Co-authored-by: xiaoyu <[email protected]>
---
 .../ZookeeperClientServerRegisterRepository.java   | 43 +++++++++++-----------
 .../ZookeeperServerRegisterRepositoryTest.java     | 24 +++++++++---
 2 files changed, 41 insertions(+), 26 deletions(-)

diff --git 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
index e37d95027..3cc385067 100644
--- 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
+++ 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
@@ -19,13 +19,11 @@ package org.apache.shenyu.register.client.server.zookeeper;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.recipes.cache.ChildData;
 import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
 import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.common.utils.GsonUtils;
 import 
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterPublisher;
@@ -33,13 +31,14 @@ import 
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterRe
 import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.apache.shenyu.register.common.dto.URIRegisterDTO;
+import org.apache.shenyu.register.common.enums.EventType;
 import org.apache.shenyu.register.common.path.RegisterPathConstants;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.nio.charset.StandardCharsets;
-import java.util.LinkedList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import java.util.Properties;
@@ -117,6 +116,7 @@ public class ZookeeperClientServerRegisterRepository 
implements ShenyuClientServ
     }
     
     abstract static class AbstractRegisterListener implements 
TreeCacheListener {
+
         @Override
         public final void childEvent(final CuratorFramework client, final 
TreeCacheEvent event) {
             ChildData childData = event.getData();
@@ -157,29 +157,30 @@ public class ZookeeperClientServerRegisterRepository 
implements ShenyuClientServ
     }
 
     class URICacheListener extends AbstractRegisterListener {
+
         @Override
         public void event(final TreeCacheEvent.Type type, final String path, 
final ChildData data) {
-            // if not uri register path, return.
-            if (!path.contains(RegisterPathConstants.ROOT_PATH)) {
+            // Non-leaf node, return directly
+            if (data.getData() == null || data.getData().length == 0) {
+                return;
+            }
+            URIRegisterDTO uriRegisterDTO = GsonUtils.getInstance()
+                    .fromJson(new String(data.getData()), 
URIRegisterDTO.class);
+            if (uriRegisterDTO == null) {
                 return;
             }
-            // get children under context path
-            int lastSepIndex = path.lastIndexOf(Constants.PATH_SEPARATOR);
-            String contextPath = path.substring(0, lastSepIndex);
-            List<String> childrenList = client.getChildren(contextPath);
-
-            List<URIRegisterDTO> registerDTOList = new LinkedList<>();
-            childrenList.forEach(addPath -> {
-                String realPath = 
RegisterPathConstants.buildRealNode(contextPath, addPath);
-                
registerDTOList.add(GsonUtils.getInstance().fromJson(client.get(realPath), 
URIRegisterDTO.class));
-            });
-
-            if (CollectionUtils.isEmpty(registerDTOList)) {
-                String[] paths = contextPath.split(Constants.PATH_SEPARATOR);
-                URIRegisterDTO uriRegisterDTO = 
URIRegisterDTO.builder().contextPath(Constants.PATH_SEPARATOR + 
paths[paths.length - 1]).rpcType(paths[paths.length - 2]).build();
-                registerDTOList.add(uriRegisterDTO);
+            switch (type) {
+                case NODE_ADDED:
+                    uriRegisterDTO.setEventType(EventType.REGISTER);
+                    publishRegisterURI(Arrays.asList(uriRegisterDTO));
+                    break;
+                case NODE_REMOVED:
+                    uriRegisterDTO.setEventType(EventType.OFFLINE);
+                    publishRegisterURI(Arrays.asList(uriRegisterDTO));
+                    break;
+                default:
+                    break;
             }
-            publishRegisterURI(registerDTOList);
         }
     }
 }
diff --git 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
index c942cb930..6de72524f 100644
--- 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
+++ 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
@@ -69,10 +69,23 @@ public class ZookeeperServerRegisterRepositoryTest {
 
             List<TreeCacheEvent> treeCacheEvent = new ArrayList<>();
             // register uri
-            
treeCacheEvent.add(treeCacheEvent("/shenyu/register/uri/test/test/test"));
-            // register metadata
-            
treeCacheEvent.add(treeCacheEvent("/shenyu/register/metadata/test/test/test"));
+            treeCacheEvent.add(
+                    treeCacheEvent(TreeCacheEvent.Type.NODE_ADDED, 
"/shenyu/register/uri/test/test/test", "{}")
+            );
+            treeCacheEvent.add(
+                    treeCacheEvent(TreeCacheEvent.Type.NODE_ADDED, 
"/shenyu/register/uri/test/test/test", "")
+            );
+            treeCacheEvent.add(
+                    treeCacheEvent(TreeCacheEvent.Type.NODE_REMOVED, 
"/shenyu/register/uri/test/test/test", "{}")
+            );
+            treeCacheEvent.add(
+                    treeCacheEvent(TreeCacheEvent.Type.NODE_REMOVED, 
"/shenyu/register/uri/test/test/test", "")
+            );
 
+            // register metadata
+            treeCacheEvent.add(
+                    treeCacheEvent(TreeCacheEvent.Type.NODE_ADDED, 
"/shenyu/register/metadata/test/test/test", "{}")
+            );
             for (TreeCacheListener treeCacheListener : treeCacheListeners) {
                 for (TreeCacheEvent event : treeCacheEvent) {
                     treeCacheListener.childEvent(curatorFramework, event);
@@ -96,12 +109,13 @@ public class ZookeeperServerRegisterRepositoryTest {
         }
     }
 
-    private static TreeCacheEvent treeCacheEvent(final String path) {
+    private static TreeCacheEvent treeCacheEvent(final TreeCacheEvent.Type 
type, final String path, final String data) {
         TreeCacheEvent treeCacheEvent = mock(TreeCacheEvent.class);
         ChildData childData = mock(ChildData.class);
+        when(treeCacheEvent.getType()).thenReturn(type);
         when(treeCacheEvent.getData()).thenReturn(childData);
         when(childData.getPath()).thenReturn(path);
-        when(childData.getData()).thenReturn("{}".getBytes());
+        when(childData.getData()).thenReturn(data.getBytes());
         return treeCacheEvent;
     }
 }

Reply via email to