中間件 ZK分佈式專題與Dubbo微服務入門 7-5 查詢節點相關信息

0    課程地址

https://coding.imooc.com/lesson/201.html#mid=12734

 

1    重點關注

1.1    本節內容

查詢節點信息

查詢子節點

查詢節點是否存在

 

1.2    關鍵代碼

    // 讀取節點數據
    // storingStatIn方法 實時獲取節點狀態信息,包括節點的版本號等信息
Stat stat = new Stat(); byte[] data = cto.client.getData().storingStatIn(stat).forPath(nodePath); System.out.println("節點" + nodePath + "的數據爲: " + new String(data)); System.out.println("該節點的版本號爲: " + stat.getVersion()); // 查詢子節點 List<String> childNodes = cto.client.getChildren() .forPath(nodePath); System.out.println("開始打印子節點:"); for (String s : childNodes) { System.out.println(s); } // 判斷節點是否存在,如果不存在則爲空 Stat statExist = cto.client.checkExists().forPath(nodePath + "/abc"); System.out.println(statExist);

 


 

 

2    課程內容


 

 


 

3    Coding

3.1    Curator查詢節點信息

  • 啓動服務端
    進入到
cd /usr/local/zookeeper/bin

 
    重啓zookeeper服務端
./zkServer.sh restart

 

  • 主類
package com.imooc.curator;

import java.util.List;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;

public class CuratorOperator {

    public CuratorFramework client = null;
    public static final String zkServerPath = "172.26.139.4:2181";

    /**
     * 實例化zk客戶端
     */
    public CuratorOperator() {
        /**
         * 同步創建zk示例,原生api是異步的
         * 
         * curator鏈接zookeeper的策略:ExponentialBackoffRetry
         * baseSleepTimeMs:初始sleep的時間
         * maxRetries:最大重試次數
         * maxSleepMs:最大重試時間
         */
//        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);
        
        /**
         * curator鏈接zookeeper的策略:RetryNTimes
         * n:重試的次數
         * sleepMsBetweenRetries:每次重試間隔的時間
         */
        RetryPolicy retryPolicy = new RetryNTimes(3, 5000);
        
        /**
         * curator鏈接zookeeper的策略:RetryOneTime
         * sleepMsBetweenRetry:每次重試間隔的時間
         */
//        RetryPolicy retryPolicy2 = new RetryOneTime(3000);
        
        /**
         * 永遠重試,不推薦使用
         */
//        RetryPolicy retryPolicy3 = new RetryForever(retryIntervalMs)
        
        /**
         * curator鏈接zookeeper的策略:RetryUntilElapsed
         * maxElapsedTimeMs:最大重試時間
         * sleepMsBetweenRetries:每次重試間隔
         * 重試時間超過maxElapsedTimeMs後,就不再重試
         */
//        RetryPolicy retryPolicy4 = new RetryUntilElapsed(2000, 3000);
        
        client = CuratorFrameworkFactory.builder()
                .connectString(zkServerPath)
                .sessionTimeoutMs(10000).retryPolicy(retryPolicy)
                .namespace("workspace").build();
        client.start();
    }
    
    /**
     * 
     * @Description: 關閉zk客戶端連接
     */
    public void closeZKClient() {
        if (client != null) {
            this.client.close();
        }
    }
    
    public static void main(String[] args) throws Exception {
        // 實例化
        CuratorOperator cto = new CuratorOperator();
        boolean isZkCuratorStarted = cto.client.isStarted();
        System.out.println("當前客戶的狀態:" + (isZkCuratorStarted ? "連接中" : "已關閉"));
        
        // 創建節點
        String nodePath = "/super/imooc";
// 讀取節點數據
        Stat stat = new Stat();
        byte[] data = cto.client.getData().storingStatIn(stat).forPath(nodePath);
        System.out.println("節點" + nodePath + "的數據爲: " + new String(data));
        System.out.println("該節點的版本號爲: " + stat.getVersion());
        
       
        
        Thread.sleep(3000);
        
        cto.closeZKClient();
        boolean isZkCuratorStarted2 = cto.client.isStarted();
        System.out.println("當前客戶的狀態:" + (isZkCuratorStarted2 ? "連接中" : "已關閉"));
    }
    
    public final static String ADD_PATH = "/super/imooc/d";
    
}

 

  • 打印日誌
2024-04-07 06:27:09,197 [main] [org.apache.curator.utils.Compatibility.<clinit>(Compatibility.java:41)] - [INFO] Running in ZooKeeper 3.4.x compatibility mode
2024-04-07 06:27:09,213 [main] [org.apache.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:120)] - [WARN] session timeout [10000] is less than connection timeout [15000]
2024-04-07 06:27:09,222 [main] [org.apache.curator.framework.imps.CuratorFrameworkImpl.start(CuratorFrameworkImpl.java:284)] - [INFO] Starting
2024-04-07 06:27:09,230 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:zookeeper.version=3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
2024-04-07 06:27:09,230 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:host.name=LAPTOP-BNI9B7NU
2024-04-07 06:27:09,231 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.version=17.0.10
2024-04-07 06:27:09,231 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.vendor=Eclipse Adoptium
2024-04-07 06:27:09,231 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.home=D:\java\develop\STS\anZh\sts-4.22.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143\jre
2024-04-07 06:27:09,231 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.class.path=D:\project\xin\zk_sts_imooc\imooc-zk-curator-maven\target\classes;C:\Users\18612\.m2\repository\org\apache\curator\curator-framework\4.0.0\curator-framework-4.0.0.jar;C:\Users\18612\.m2\repository\org\apache\curator\curator-client\4.0.0\curator-client-4.0.0.jar;C:\Users\18612\.m2\repository\com\google\guava\guava\20.0\guava-20.0.jar;C:\Users\18612\.m2\repository\org\apache\curator\curator-recipes\4.0.0\curator-recipes-4.0.0.jar;C:\Users\18612\.m2\repository\org\apache\zookeeper\zookeeper\3.4.11\zookeeper-3.4.11.jar;C:\Users\18612\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\18612\.m2\repository\jline\jline\0.9.94\jline-0.9.94.jar;C:\Users\18612\.m2\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;C:\Users\18612\.m2\repository\io\netty\netty\3.10.5.Final\netty-3.10.5.Final.jar;C:\Users\18612\.m2\repository\joda-time\joda-time\2.5\joda-time-2.5.jar;C:\Users\18612\.m2\repository\org\apache\commons\commons-lang3\3.3.2\commons-lang3-3.3.2.jar;C:\Users\18612\.m2\repository\commons-io\commons-io\1.3.2\commons-io-1.3.2.jar;C:\Users\18612\.m2\repository\commons-net\commons-net\3.3\commons-net-3.3.jar;C:\Users\18612\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.7.4\jackson-databind-2.7.4.jar;C:\Users\18612\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.7.4\jackson-core-2.7.4.jar;C:\Users\18612\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.7.4\jackson-annotations-2.7.4.jar;C:\Users\18612\.m2\repository\org\apache\httpcomponents\httpclient\4.3.5\httpclient-4.3.5.jar;C:\Users\18612\.m2\repository\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;C:\Users\18612\.m2\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;C:\Users\18612\.m2\repository\commons-codec\commons-codec\1.6\commons-codec-1.6.jar;C:\Users\18612\.m2\repository\org\mybatis\mybatis\3.2.8\mybatis-3.2.8.jar;C:\Users\18612\.m2\repository\org\mybatis\mybatis-spring\1.2.2\mybatis-spring-1.2.2.jar;C:\Users\18612\.m2\repository\com\github\miemiedev\mybatis-paginator\1.2.15\mybatis-paginator-1.2.15.jar;C:\Users\18612\.m2\repository\com\github\pagehelper\pagehelper\4.1.3\pagehelper-4.1.3.jar;C:\Users\18612\.m2\repository\com\github\jsqlparser\jsqlparser\0.9.4\jsqlparser-0.9.4.jar;C:\Users\18612\.m2\repository\mysql\mysql-connector-java\5.1.41\mysql-connector-java-5.1.41.jar;C:\Users\18612\.m2\repository\com\alibaba\druid\1.1.0\druid-1.1.0.jar;C:\Users\18612\.m2\repository\org\springframework\spring-core\4.3.3.RELEASE\spring-core-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-context\4.3.3.RELEASE\spring-context-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-aop\4.3.3.RELEASE\spring-aop-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-expression\4.3.3.RELEASE\spring-expression-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-context-support\4.3.3.RELEASE\spring-context-support-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-beans\4.3.3.RELEASE\spring-beans-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-webmvc\4.3.3.RELEASE\spring-webmvc-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-web\4.3.3.RELEASE\spring-web-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-jdbc\4.3.3.RELEASE\spring-jdbc-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-tx\4.3.3.RELEASE\spring-tx-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\springframework\spring-aspects\4.3.3.RELEASE\spring-aspects-4.3.3.RELEASE.jar;C:\Users\18612\.m2\repository\org\aspectj\aspectjweaver\1.8.9\aspectjweaver-1.8.9.jar;C:\Users\18612\.m2\repository\jstl\jstl\1.2\jstl-1.2.jar;C:\Users\18612\.m2\repository\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;C:\Users\18612\.m2\repository\javax\servlet\jsp-api\2.0\jsp-api-2.0.jar;C:\Users\18612\.m2\repository\commons-fileupload\commons-fileupload\1.3.1\commons-fileupload-1.3.1.jar;C:\Users\18612\.m2\repository\redis\clients\jedis\2.8.0\jedis-2.8.0.jar;C:\Users\18612\.m2\repository\org\apache\commons\commons-pool2\2.3\commons-pool2-2.3.jar;C:\Users\18612\.m2\repository\org\apache\solr\solr-solrj\4.10.3\solr-solrj-4.10.3.jar;C:\Users\18612\.m2\repository\org\apache\httpcomponents\httpmime\4.3.1\httpmime-4.3.1.jar;C:\Users\18612\.m2\repository\org\codehaus\woodstox\wstx-asl\3.2.7\wstx-asl-3.2.7.jar;C:\Users\18612\.m2\repository\org\noggit\noggit\0.5\noggit-0.5.jar;C:\Users\18612\.m2\repository\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;C:\Users\18612\.m2\repository\org\slf4j\slf4j-api\1.7.21\slf4j-api-1.7.21.jar;C:\Users\18612\.m2\repository\org\slf4j\slf4j-log4j12\1.7.21\slf4j-log4j12-1.7.21.jar
2024-04-07 06:27:09,231 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.library.path=D:\java\develop\STS\anZh\sts-4.22.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143\jre\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:/java/develop/STS/anZh/sts-4.22.0.RELEASE//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143/jre/bin/server;D:/java/develop/STS/anZh/sts-4.22.0.RELEASE//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143/jre/bin;D:\java\transport\secureCRT\anZh\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Git\cmd;C:\Users\18612\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\nodejs\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\18612\AppData\Local\Programs\Python\Python35\Scripts\;C:\Users\18612\AppData\Local\Programs\Python\Python35\;C:\Users\18612\AppData\Local\Microsoft\WindowsApps;D:\java\envir\jdk1.8\anZh\bin;D:\java\envir\jdk1.8\anZh\jre\bin;D:\Python\Fiddle\anZh;C:\Users\18612\AppData\Roaming\npm;C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt;C:\Program Files (x86)\Tencent\QQGameTempest\Hall.57795\;C:\Users\18612\AppData\Local\Microsoft\WindowsApps;D:\java\maven\apache-maven-3.8.2\bin;;D:\java\develop\STS\anZh\sts-4.22.0.RELEASE;;.
2024-04-07 06:27:09,231 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.io.tmpdir=C:\Users\18612\AppData\Local\Temp\
2024-04-07 06:27:09,232 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:java.compiler=<NA>
2024-04-07 06:27:09,232 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:os.name=Windows 11
2024-04-07 06:27:09,232 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:os.arch=amd64
2024-04-07 06:27:09,232 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:os.version=10.0
2024-04-07 06:27:09,232 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:user.name=18612
2024-04-07 06:27:09,234 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:user.home=C:\Users\18612
2024-04-07 06:27:09,234 [main] [org.apache.zookeeper.Environment.logEnv(Environment.java:100)] - [INFO] Client environment:user.dir=D:\project\xin\zk_sts_imooc\imooc-zk-curator-maven
2024-04-07 06:27:09,234 [main] [org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:441)] - [INFO] Initiating client connection, connectString=172.26.139.4:2181 sessionTimeout=10000 watcher=org.apache.curator.ConnectionState@5158b42f
2024-04-07 06:27:09,349 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:1035)] - [INFO] Opening socket connection to server 172.26.139.4/172.26.139.4:2181. Will not attempt to authenticate using SASL (unknown error)
2024-04-07 06:27:09,351 [main] [org.apache.curator.framework.imps.CuratorFrameworkImpl.start(CuratorFrameworkImpl.java:326)] - [INFO] Default schema
當前客戶的狀態:連接中
2024-04-07 06:27:09,354 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:877)] - [INFO] Socket connection established to 172.26.139.4/172.26.139.4:2181, initiating session
2024-04-07 06:27:09,360 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1302)] - [INFO] Session establishment complete on server 172.26.139.4/172.26.139.4:2181, sessionid = 0x1003feb17e70002, negotiated timeout = 10000
2024-04-07 06:27:09,365 [main-EventThread] [org.apache.curator.framework.state.ConnectionStateManager.postState(ConnectionStateManager.java:237)] - [INFO] State change: CONNECTED
節點/super/imooc的數據爲: 222
該節點的版本號爲: 0
2024-04-07 06:27:12,388 [Curator-Framework-0] [org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:924)] - [INFO] backgroundOperationsLoop exiting
2024-04-07 06:27:12,392 [main] [org.apache.zookeeper.ZooKeeper.close(ZooKeeper.java:687)] - [INFO] Session: 0x1003feb17e70002 closed
當前客戶的狀態:已關閉

 

3.2    Curator查詢子節點信息

  • 啓動服務端
    進入到
cd /usr/local/zookeeper/bin

 
    重啓zookeeper服務端
./zkServer.sh restart

 

  • 主類
package com.imooc.curator;

import java.util.List;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;

public class CuratorOperator {

    public CuratorFramework client = null;
    public static final String zkServerPath = "172.26.139.4:2181";

    /**
     * 實例化zk客戶端
     */
    public CuratorOperator() {
        /**
         * 同步創建zk示例,原生api是異步的
         * 
         * curator鏈接zookeeper的策略:ExponentialBackoffRetry
         * baseSleepTimeMs:初始sleep的時間
         * maxRetries:最大重試次數
         * maxSleepMs:最大重試時間
         */
//        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);
        
        /**
         * curator鏈接zookeeper的策略:RetryNTimes
         * n:重試的次數
         * sleepMsBetweenRetries:每次重試間隔的時間
         */
        RetryPolicy retryPolicy = new RetryNTimes(3, 5000);
        
        /**
         * curator鏈接zookeeper的策略:RetryOneTime
         * sleepMsBetweenRetry:每次重試間隔的時間
         */
//        RetryPolicy retryPolicy2 = new RetryOneTime(3000);
        
        /**
         * 永遠重試,不推薦使用
         */
//        RetryPolicy retryPolicy3 = new RetryForever(retryIntervalMs)
        
        /**
         * curator鏈接zookeeper的策略:RetryUntilElapsed
         * maxElapsedTimeMs:最大重試時間
         * sleepMsBetweenRetries:每次重試間隔
         * 重試時間超過maxElapsedTimeMs後,就不再重試
         */
//        RetryPolicy retryPolicy4 = new RetryUntilElapsed(2000, 3000);
        
        client = CuratorFrameworkFactory.builder()
                .connectString(zkServerPath)
                .sessionTimeoutMs(10000).retryPolicy(retryPolicy)
                .namespace("workspace").build();
        client.start();
    }
    
    /**
     * 
     * @Description: 關閉zk客戶端連接
     */
    public void closeZKClient() {
        if (client != null) {
            this.client.close();
        }
    }
    
    public static void main(String[] args) throws Exception {
        // 實例化
        CuratorOperator cto = new CuratorOperator();
        boolean isZkCuratorStarted = cto.client.isStarted();
        System.out.println("當前客戶的狀態:" + (isZkCuratorStarted ? "連接中" : "已關閉"));
        
        // 創建節點
        String nodePath = "/super/imooc";
//        byte[] data = "superme".getBytes();
//        cto.client.create().creatingParentsIfNeeded()
//            .withMode(CreateMode.PERSISTENT)
//            .withACL(Ids.OPEN_ACL_UNSAFE)
//            .forPath(nodePath, data);
        
        // 更新節點數據
//        byte[] newData = "batman".getBytes();
//        cto.client.setData().withVersion(0).forPath(nodePath, newData);
        
        // 刪除節點
//        cto.client.delete()
//                  .guaranteed()                    // 如果刪除失敗,那麼在後端還是繼續會刪除,直到成功
//                  .deletingChildrenIfNeeded()    // 如果有子節點,就刪除
//                  .withVersion(0)
//                  .forPath(nodePath);
        
        
        
        // 讀取節點數據
//        Stat stat = new Stat();
//        byte[] data = cto.client.getData().storingStatIn(stat).forPath(nodePath);
//        System.out.println("節點" + nodePath + "的數據爲: " + new String(data));
//        System.out.println("該節點的版本號爲: " + stat.getVersion());
//        
        
        // 查詢子節點
        List<String> childNodes = cto.client.getChildren()
                                            .forPath(nodePath);
        System.out.println("開始打印子節點:");
        for (String s : childNodes) {
            System.out.println(s);
        }
        
                
        // 判斷節點是否存在,如果不存在則爲空
//        Stat statExist = cto.client.checkExists().forPath(nodePath + "/abc");
//        System.out.println(statExist);
        
        
        // watcher 事件  當使用usingWatcher的時候,監聽只會觸發一次,監聽完畢後就銷燬
//        cto.client.getData().usingWatcher(new MyCuratorWatcher()).forPath(nodePath);
//        cto.client.getData().usingWatcher(new MyWatcher()).forPath(nodePath);
        
        // 爲節點添加watcher
        // NodeCache: 監聽數據節點的變更,會觸發事件
//        final NodeCache nodeCache = new NodeCache(cto.client, nodePath);
//        // buildInitial : 初始化的時候獲取node的值並且緩存
//        nodeCache.start(true);
//        if (nodeCache.getCurrentData() != null) {
//            System.out.println("節點初始化數據爲:" + new String(nodeCache.getCurrentData().getData()));
//        } else {
//            System.out.println("節點初始化數據爲空...");
//        }
//        nodeCache.getListenable().addListener(new NodeCacheListener() {
//            public void nodeChanged() throws Exception {
//                if (nodeCache.getCurrentData() == null) {
//                    System.out.println("空");
//                    return;
//                }
//                String data = new String(nodeCache.getCurrentData().getData());
//                System.out.println("節點路徑:" + nodeCache.getCurrentData().getPath() + "數據:" + data);
//            }
//        });
        
        
        // 爲子節點添加watcher
        // PathChildrenCache: 監聽數據節點的增刪改,會觸發事件
//        String childNodePathCache =  nodePath;
//        // cacheData: 設置緩存節點的數據狀態
//        final PathChildrenCache childrenCache = new PathChildrenCache(cto.client, childNodePathCache, true);
//        /**
//         * StartMode: 初始化方式
//         * POST_INITIALIZED_EVENT:異步初始化,初始化之後會觸發事件
//         * NORMAL:異步初始化
//         * BUILD_INITIAL_CACHE:同步初始化
//         */
//        childrenCache.start(StartMode.POST_INITIALIZED_EVENT);
//        
//        List<ChildData> childDataList = childrenCache.getCurrentData();
//        System.out.println("當前數據節點的子節點數據列表:");
//        for (ChildData cd : childDataList) {
//            String childData = new String(cd.getData());
//            System.out.println(childData);
//        }
//        
//        childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
//            public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
//                if(event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)){
//                    System.out.println("子節點初始化ok...");
//                }
//                
//                else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){
//                    String path = event.getData().getPath();
//                    if (path.equals(ADD_PATH)) {
//                        System.out.println("添加子節點:" + event.getData().getPath());
//                        System.out.println("子節點數據:" + new String(event.getData().getData()));
//                    } else if (path.equals("/super/imooc/e")) {
//                        System.out.println("添加不正確...");
//                    }
//                    
//                }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)){
//                    System.out.println("刪除子節點:" + event.getData().getPath());
//                }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
//                    System.out.println("修改子節點路徑:" + event.getData().getPath());
//                    System.out.println("修改子節點數據:" + new String(event.getData().getData()));
//                }
//            }
//        });
        
        Thread.sleep(3000);
        
        cto.closeZKClient();
        boolean isZkCuratorStarted2 = cto.client.isStarted();
        System.out.println("當前客戶的狀態:" + (isZkCuratorStarted2 ? "連接中" : "已關閉"));
    }
    
    public final static String ADD_PATH = "/super/imooc/d";
    
}

 

  • 打印日誌
當前客戶的狀態:連接中
2024-04-07 06:37:24,952 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:877)] - [INFO] Socket connection established to 172.26.139.4/172.26.139.4:2181, initiating session
2024-04-07 06:37:24,960 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1302)] - [INFO] Session establishment complete on server 172.26.139.4/172.26.139.4:2181, sessionid = 0x1003feb17e70003, negotiated timeout = 10000
2024-04-07 06:37:24,964 [main-EventThread] [org.apache.curator.framework.state.ConnectionStateManager.postState(ConnectionStateManager.java:237)] - [INFO] State change: CONNECTED
開始打印子節點:
a
b
2024-04-07 06:37:27,990 [Curator-Framework-0] [org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:924)] - [INFO] backgroundOperationsLoop exiting
2024-04-07 06:37:27,994 [main] [org.apache.zookeeper.ZooKeeper.close(ZooKeeper.java:687)] - [INFO] Session: 0x1003feb17e70003 closed
當前客戶的狀態:已關閉

 

 

3.3    Curator驗證節點是否存在

  • 啓動服務端
    進入到
cd /usr/local/zookeeper/bin

 
    重啓zookeeper服務端
./zkServer.sh restart

 

  • 主類
package com.imooc.curator;

import java.util.List;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;

public class CuratorOperator {

    public CuratorFramework client = null;
    public static final String zkServerPath = "172.26.139.4:2181";

    /**
     * 實例化zk客戶端
     */
    public CuratorOperator() {
        /**
         * 同步創建zk示例,原生api是異步的
         * 
         * curator鏈接zookeeper的策略:ExponentialBackoffRetry
         * baseSleepTimeMs:初始sleep的時間
         * maxRetries:最大重試次數
         * maxSleepMs:最大重試時間
         */
//        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);
        
        /**
         * curator鏈接zookeeper的策略:RetryNTimes
         * n:重試的次數
         * sleepMsBetweenRetries:每次重試間隔的時間
         */
        RetryPolicy retryPolicy = new RetryNTimes(3, 5000);
        
        /**
         * curator鏈接zookeeper的策略:RetryOneTime
         * sleepMsBetweenRetry:每次重試間隔的時間
         */
//        RetryPolicy retryPolicy2 = new RetryOneTime(3000);
        
        /**
         * 永遠重試,不推薦使用
         */
//        RetryPolicy retryPolicy3 = new RetryForever(retryIntervalMs)
        
        /**
         * curator鏈接zookeeper的策略:RetryUntilElapsed
         * maxElapsedTimeMs:最大重試時間
         * sleepMsBetweenRetries:每次重試間隔
         * 重試時間超過maxElapsedTimeMs後,就不再重試
         */
//        RetryPolicy retryPolicy4 = new RetryUntilElapsed(2000, 3000);
        
        client = CuratorFrameworkFactory.builder()
                .connectString(zkServerPath)
                .sessionTimeoutMs(10000).retryPolicy(retryPolicy)
                .namespace("workspace").build();
        client.start();
    }
    
    /**
     * 
     * @Description: 關閉zk客戶端連接
     */
    public void closeZKClient() {
        if (client != null) {
            this.client.close();
        }
    }
    
    public static void main(String[] args) throws Exception {
        // 實例化
        CuratorOperator cto = new CuratorOperator();
        boolean isZkCuratorStarted = cto.client.isStarted();
        System.out.println("當前客戶的狀態:" + (isZkCuratorStarted ? "連接中" : "已關閉"));
        
        // 創建節點
        String nodePath = "/super/imooc";
//        byte[] data = "superme".getBytes();
//        cto.client.create().creatingParentsIfNeeded()
//            .withMode(CreateMode.PERSISTENT)
//            .withACL(Ids.OPEN_ACL_UNSAFE)
//            .forPath(nodePath, data);
        
        // 更新節點數據
//        byte[] newData = "batman".getBytes();
//        cto.client.setData().withVersion(0).forPath(nodePath, newData);
        
        // 刪除節點
//        cto.client.delete()
//                  .guaranteed()                    // 如果刪除失敗,那麼在後端還是繼續會刪除,直到成功
//                  .deletingChildrenIfNeeded()    // 如果有子節點,就刪除
//                  .withVersion(0)
//                  .forPath(nodePath);
        
        
        
        // 讀取節點數據
//        Stat stat = new Stat();
//        byte[] data = cto.client.getData().storingStatIn(stat).forPath(nodePath);
//        System.out.println("節點" + nodePath + "的數據爲: " + new String(data));
//        System.out.println("該節點的版本號爲: " + stat.getVersion());
//        
        
        // 查詢子節點
//        List<String> childNodes = cto.client.getChildren()
//                                            .forPath(nodePath);
//        System.out.println("開始打印子節點:");
//        for (String s : childNodes) {
//            System.out.println(s);
//        }
        
                
        // 判斷節點是否存在,如果不存在則爲空
        Stat statExist = cto.client.checkExists().forPath(nodePath + "/abc");
        System.out.println(statExist);
        
        
        // watcher 事件  當使用usingWatcher的時候,監聽只會觸發一次,監聽完畢後就銷燬
//        cto.client.getData().usingWatcher(new MyCuratorWatcher()).forPath(nodePath);
//        cto.client.getData().usingWatcher(new MyWatcher()).forPath(nodePath);
        
        // 爲節點添加watcher
        // NodeCache: 監聽數據節點的變更,會觸發事件
//        final NodeCache nodeCache = new NodeCache(cto.client, nodePath);
//        // buildInitial : 初始化的時候獲取node的值並且緩存
//        nodeCache.start(true);
//        if (nodeCache.getCurrentData() != null) {
//            System.out.println("節點初始化數據爲:" + new String(nodeCache.getCurrentData().getData()));
//        } else {
//            System.out.println("節點初始化數據爲空...");
//        }
//        nodeCache.getListenable().addListener(new NodeCacheListener() {
//            public void nodeChanged() throws Exception {
//                if (nodeCache.getCurrentData() == null) {
//                    System.out.println("空");
//                    return;
//                }
//                String data = new String(nodeCache.getCurrentData().getData());
//                System.out.println("節點路徑:" + nodeCache.getCurrentData().getPath() + "數據:" + data);
//            }
//        });
        
        
        // 爲子節點添加watcher
        // PathChildrenCache: 監聽數據節點的增刪改,會觸發事件
//        String childNodePathCache =  nodePath;
//        // cacheData: 設置緩存節點的數據狀態
//        final PathChildrenCache childrenCache = new PathChildrenCache(cto.client, childNodePathCache, true);
//        /**
//         * StartMode: 初始化方式
//         * POST_INITIALIZED_EVENT:異步初始化,初始化之後會觸發事件
//         * NORMAL:異步初始化
//         * BUILD_INITIAL_CACHE:同步初始化
//         */
//        childrenCache.start(StartMode.POST_INITIALIZED_EVENT);
//        
//        List<ChildData> childDataList = childrenCache.getCurrentData();
//        System.out.println("當前數據節點的子節點數據列表:");
//        for (ChildData cd : childDataList) {
//            String childData = new String(cd.getData());
//            System.out.println(childData);
//        }
//        
//        childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
//            public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
//                if(event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)){
//                    System.out.println("子節點初始化ok...");
//                }
//                
//                else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){
//                    String path = event.getData().getPath();
//                    if (path.equals(ADD_PATH)) {
//                        System.out.println("添加子節點:" + event.getData().getPath());
//                        System.out.println("子節點數據:" + new String(event.getData().getData()));
//                    } else if (path.equals("/super/imooc/e")) {
//                        System.out.println("添加不正確...");
//                    }
//                    
//                }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)){
//                    System.out.println("刪除子節點:" + event.getData().getPath());
//                }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
//                    System.out.println("修改子節點路徑:" + event.getData().getPath());
//                    System.out.println("修改子節點數據:" + new String(event.getData().getData()));
//                }
//            }
//        });
        
        Thread.sleep(3000);
        
        cto.closeZKClient();
        boolean isZkCuratorStarted2 = cto.client.isStarted();
        System.out.println("當前客戶的狀態:" + (isZkCuratorStarted2 ? "連接中" : "已關閉"));
    }
    
    public final static String ADD_PATH = "/super/imooc/d";
    
}

 

  • 打印日誌
當前客戶的狀態:連接中
2024-04-07 06:40:41,714 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:877)] - [INFO] Socket connection established to 172.26.139.4/172.26.139.4:2181, initiating session
2024-04-07 06:40:41,732 [main-SendThread(172.26.139.4:2181)] [org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1302)] - [INFO] Session establishment complete on server 172.26.139.4/172.26.139.4:2181, sessionid = 0x1003feb17e70004, negotiated timeout = 10000
2024-04-07 06:40:41,745 [main-EventThread] [org.apache.curator.framework.state.ConnectionStateManager.postState(ConnectionStateManager.java:237)] - [INFO] State change: CONNECTED
null
2024-04-07 06:40:44,800 [Curator-Framework-0] [org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:924)] - [INFO] backgroundOperationsLoop exiting
2024-04-07 06:40:44,804 [main] [org.apache.zookeeper.ZooKeeper.close(ZooKeeper.java:687)] - [INFO] Session: 0x1003feb17e70004 closed
當前客戶的狀態:已關閉

 




 

 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章