zookeeper学习笔记(四)使用Java连接zk,操作zk

创建maven工程

<dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
</dependency>

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
</dependency>

在配置文件log4j.properties(文件名必须这个,放在resources目录) 全选粘贴如下代码:

# Global logging configuration 开发时候建议使用 debug
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在这里插入图片描述

API链接zk集群

zk的链接API,因为调用ZooKeeper构造函数和Watcher接口中的process方法被执行是在两个线程中,需要利用信号量来同步两个操作,使用CountDownLatch

connectionString - ZooKeeper集合主机。
sessionTimeout - 会话超时(以毫秒为单位)。
watcher - 实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状态。


ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

CountDownLatch类只提供了一个构造器:

public CountDownLatch(int count) {  };  //参数count为计数值

然后下面这3个方法是CountDownLatch类中最重要的方法:

public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没为0的话就会继续执行
public void countDown() { };  //将count值减1

代码

链接zk不是同步,而是异步,可能有多个请求链接zk,所以创建完连接并不代表一定会连接成功,而是要等待,等待给监控器一个连接状态,才算连接完毕。

因为调用ZooKeeper构造函数和Watcher接口中的process方法被执行是在两个线程中,需要利用信号量来同步两个操作,使用CountDownLatch

package org.example;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.util.concurrent.CountDownLatch;

public class ZookeeperConnect {
    public static void main(String[] args) {
        try {
            // 计数器对象
            final CountDownLatch countDownLatch=new CountDownLatch(1);
            // arg1:服务器的ip和端口
            // arg2:客户端与服务器之间的会话超时时间,以毫秒为单位
            // arg3:监视器对象,捕获客户端,因为调用ZooKeeper构造函数和process方法被执行是在两个线程中,需要利用信号量来同步两个操作。
            ZooKeeper zooKeeper=new ZooKeeper("ip:端口",
                    5000, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if(event.getState()==Event.KeeperState.SyncConnected)
                    {
                        System.out.println("连接创建成功!");
                        countDownLatch.countDown();
                    }
                }
            });
            // 主线程阻塞等待连接对象的创建成功
            countDownLatch.await();
            // 会话编号
            System.out.println(zooKeeper.getSessionId());
            zooKeeper.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

输出:

INFO [main] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
 INFO [main] - Client environment:host.name=liutao-GE5S
 INFO [main] - Client environment:java.version=1.8.0_281
 INFO [main] - Client environment:java.vendor=Oracle Corporation
 INFO [main] - Client environment:java.home=/usr/local/jdk8/jre
 INFO [main] - Client environment:java.class.path=/usr/local/jdk8/jre/lib/charsets.jar:/usr/local/jdk8/jre/lib/deploy.jar:/usr/local/jdk8/jre/lib/ext/cldrdata.jar:/usr/local/jdk8/jre/lib/ext/dnsns.jar:/usr/local/jdk8/jre/lib/ext/jaccess.jar:/usr/local/jdk8/jre/lib/ext/jfxrt.jar:/usr/local/jdk8/jre/lib/ext/localedata.jar:/usr/local/jdk8/jre/lib/ext/nashorn.jar:/usr/local/jdk8/jre/lib/ext/sunec.jar:/usr/local/jdk8/jre/lib/ext/sunjce_provider.jar:/usr/local/jdk8/jre/lib/ext/sunpkcs11.jar:/usr/local/jdk8/jre/lib/ext/zipfs.jar:/usr/local/jdk8/jre/lib/javaws.jar:/usr/local/jdk8/jre/lib/jce.jar:/usr/local/jdk8/jre/lib/jfr.jar:/usr/local/jdk8/jre/lib/jfxswt.jar:/usr/local/jdk8/jre/lib/jsse.jar:/usr/local/jdk8/jre/lib/management-agent.jar:/usr/local/jdk8/jre/lib/plugin.jar:/usr/local/jdk8/jre/lib/resources.jar:/usr/local/jdk8/jre/lib/rt.jar:/home/liutao/IdeaProject/zookeeperapi/target/classes:/home/liutao/.m2/repository/org/apache/zookeeper/zookeeper/3.4.6/zookeeper-3.4.6.jar:/home/liutao/.m2/repository/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar:/home/liutao/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar:/home/liutao/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar:/home/liutao/.m2/repository/jline/jline/0.9.94/jline-0.9.94.jar:/home/liutao/.m2/repository/io/netty/netty/3.7.0.Final/netty-3.7.0.Final.jar:/opt/idea-IU-203.7148.57/lib/idea_rt.jar
 INFO [main] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
 INFO [main] - Client environment:java.io.tmpdir=/tmp
 INFO [main] - Client environment:java.compiler=<NA>
 INFO [main] - Client environment:os.name=Linux
 INFO [main] - Client environment:os.arch=amd64
 INFO [main] - Client environment:os.version=5.8.0-48-generic
 INFO [main] - Client environment:user.name=liutao
 INFO [main] - Client environment:user.home=/home/liutao
 INFO [main] - Client environment:user.dir=/home/liutao/IdeaProject
 INFO [main] - Initiating client connection, connectString=10.10.108.71:2181 sessionTimeout=6000 watcher=org.example.ZookeeperConnect$1@37f8bb67
DEBUG [main] - zookeeper.disableAutoWatchReset is false
 INFO [main-SendThread(10.10.108.71:2181)] - Opening socket connection to server 10.10.108.71/10.10.108.71:2181. Will not attempt to authenticate using SASL (unknown error)
 INFO [main-SendThread(10.10.108.71:2181)] - Socket connection established to 10.10.108.71/10.10.108.71:2181, initiating session
DEBUG [main-SendThread(10.10.108.71:2181)] - Session establishment request sent on 10.10.108.71/10.10.108.71:2181
 INFO [main-SendThread(10.10.108.71:2181)] - Session establishment complete on server 10.10.108.71/10.10.108.71:2181, sessionid = 0x178a5cabcf60002, negotiated timeout = 6000
连接创建成功!
106016881415421954
DEBUG [main] - Closing session: 0x178a5cabcf60002
DEBUG [main] - Closing client for session: 0x178a5cabcf60002
DEBUG [main-SendThread(10.10.108.71:2181)] - Reading reply sessionid:0x178a5cabcf60002, packet:: clientPath:null serverPath:null finished:false header:: 1,-11  replyHeader:: 1,12884901912,0  request:: null response:: null
DEBUG [main] - Disconnecting client for session: 0x178a5cabcf60002
 INFO [main] - Session: 0x178a5cabcf60002 closed
 INFO [main-EventThread] - EventThread shut down

Process finished with exit code 

创建结点

// 同步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
// 异步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback callBack,Object ctx)

path - znode路径。例如,/node1 /node1/node11
data - 要存储在指定znode路径中的数据
acl - 要创建的节点的访问控制列表。zookeeper API提供了一个静态接口 ZooDefs.Ids来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE 返回打开znode的acl列表。
createMode - 节点的类型,这是一个枚举。 callBack-异步回调接口 ctx-传递上下文参数

需要执行的情况太多,需要用到junit

以下是JUnit4常用的几个annotation:

@Before:初始化方法 对于每一个测试方法都要执行一次(注意与BeforeClass区别,后者是对于所有方法执行一次)
@After:释放资源 对于每一个测试方法都要执行一次(注意与AfterClass区别,后者是对于所有方法执行一次)
@Test:测试方法,在这里可以测试期望异常和超时时间
@Test(expected=ArithmeticException.class)检查被测方法是否抛出ArithmeticException异常
@Ignore:忽略的测试方法 @BeforeClass:针对所有测试,只执行一次,且必须为static void
@AfterClass:针对所有测试,只执行一次,且必须为static void 一个JUnit4的单元测试用例执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
每一个测试方法的调用顺序为: @Before -> @Test -> @After;

代码

package org.example;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ZKCreate {
    String IP="10.10.108.72:2181";
    ZooKeeper zooKeeper;
    @Before
    public void before()throws Exception{
        // 计数器对象
        final CountDownLatch countDownLatch=new CountDownLatch(1);
        // arg1:服务器的ip和端口
        // arg2:客户端与服务器之间的会话超时时 ,以毫秒为单位的
        // arg3:监视器对象
                zooKeeper=new ZooKeeper(IP, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if(event.getState()==Event.KeeperState.SyncConnected) {
                    System.out.println("连接创建成功!");
                    countDownLatch.countDown();
                }
            }
        });
        // 主线程阻塞等待连接对象的创建成功
        countDownLatch.await();
    }
    @After
    public void after()throws Exception{
        zooKeeper.close();
    }

    @Test
    public void create1()throws Exception{
        // arg1:节点的路径
        // arg2:节点的数据
        // arg3:权限列表 world:anyone:cdrwa
        // arg4:节点类型 持久化节点
        zooKeeper.create("/create/node1","node1".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    @Test
    public void create2() throws Exception {
        // Ids.READ_ACL_UNSAFE world:anyone:r
        zooKeeper.create("/create/node2", "node2".getBytes(),
                ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    @Test
    public void create3() throws Exception {
        // world授权模式
        // 权限列表
        List<ACL> acls = new ArrayList<ACL>();
        // 授权模式和授权对象
        Id id = new Id("world", "anyone");
        // 权限设置
        acls.add(new ACL(ZooDefs.Perms.READ, id));
        acls.add(new ACL(ZooDefs.Perms.WRITE, id));
        zooKeeper.create("/create/node3", "node3".getBytes(), acls,
                CreateMode.PERSISTENT);
    }
    @Test
    public void create4() throws Exception {
        // ip授权模式
        // 权限列表
        List<ACL> acls = new ArrayList<ACL>();
        // 授权模式和授权对象
        Id id = new Id("ip", "192.168.60.130");
        // 权限设置
        acls.add(new ACL(ZooDefs.Perms.ALL, id));

        zooKeeper.create("/create/node4", "node4".getBytes(), acls,
                CreateMode.PERSISTENT);
    }
    @Test
    public void create5() throws Exception {
        // auth授权模式
        // 添加授权用户
        zooKeeper.addAuthInfo("digest", "itcast:123456".getBytes());
        zooKeeper.create("/create/node5", "node5".getBytes(),
                ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
    }
    @Test
    public void create6() throws Exception {
        // auth授权模式
        // 添加授权用户
        zooKeeper.addAuthInfo("digest", "itcast:123456".getBytes());
        // 权限列表
        List<ACL> acls = new ArrayList<ACL>();
        // 授权模式和授权对象
        Id id = new Id("auth", "itcast");
        // 权限设置
        acls.add(new ACL(ZooDefs.Perms.READ, id));
        zooKeeper.create("/create/node6", "node6".getBytes(), acls,
                CreateMode.PERSISTENT);
    }
    @Test
    public void create7() throws Exception {
        // digest授权模式
        // 权限列表
        List<ACL> acls = new ArrayList<ACL>();
        // 授权模式和授权对象
        Id id = new Id("digest", "itheima:qlzQzCLKhBROghkooLvb+Mlwv4A=");
        // 权限设置
        acls.add(new ACL(ZooDefs.Perms.ALL, id));
        zooKeeper.create("/create/node7", "node7".getBytes(), acls,
                CreateMode.PERSISTENT);
    }

    @Test
    public void create8() throws Exception {
        // 持久化顺序节点
        // Ids.OPEN_ACL_UNSAFE world:anyone:cdrwa
        String result = zooKeeper.create("/create/node8",
                "node8".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println(result);
    }
    @Test
    public void create9() throws Exception {
        // 临时节点
        // Ids.OPEN_ACL_UNSAFE world:anyone:cdrwa
        String result = zooKeeper.create("/create/node9",
                "node9".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println(result);
    }

    @Test
    public void create10() throws Exception {
        // 临时顺序节点
        // Ids.OPEN_ACL_UNSAFE world:anyone:cdrwa
        String result = zooKeeper.create("/create/node10",
                "node10".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println(result);
    }

    @Test
    public void create11() throws Exception {
        // 异步方式创建节点
        zooKeeper.create("/create/node11", "node11".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT,
                new AsyncCallback.StringCallback() {
                            @Override
                            public void processResult(int rc, String path, Object ctx, String name) {
                            // 0 代表创建成功
                                System.out.println(rc);
                            // 节点的路径
                                System.out.println(path);
                            // 节点的路径
                                System.out.println(name);
                            // 上下文参数
                                System.out.println(ctx);
                            }
                        }, "I am context");
        Thread.sleep(10000);
        System.out.println("结束");
    }
}

更新节点

// 同步方式
setData(String path, byte[] data, int version)
// 异步方式
setData(String path, byte[] data, int version,AsyncCallback.StatCallback callBack, Object ctx)

path- znode路径 data - 要存储在指定znode路径中的数据。 version-
znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本 号。
callBack-异步回调接口
ctx-传递上下文参数

代码

package org.example;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
public class ZKSet {
    String IP = "10.10.108.71:2181";
    ZooKeeper zookeeper;
    @Before
    public void before() throws Exception {
        final CountDownLatch countDownLatch = new CountDownLatch(1);
        // arg1:zookeeper服务器的ip地址和端口号
        // arg2:连接的超时时间,以毫秒为单位
        // arg3:监听器对象
                zookeeper = new ZooKeeper(IP, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getState() == Event.KeeperState.SyncConnected)
                {
                    System.out.println("连接创建成功!");
                    countDownLatch.countDown();
                }
            }
        });
    // 使主线程阻塞等待
        countDownLatch.await();
    }

    @After
    public void after() throws Exception {
        zookeeper.close();
    }

    @Test
    public void set1() throws Exception {
    // arg1:节点的路径
    // arg2:节点修改的数据
    // arg3:更新操作中的版本参数如果为-1,则表示更新操作针对任何版本均可。当更新版本不为-1,且不等于节点的目前版本,则更新失败。
        Stat stat=zookeeper.setData("/set/node1","node13".getBytes(),-1);
    // 节点的版本号
        System.out.println(stat.getVersion());
    // 节点的创建时间
        System.out.println(stat.getCtime());
    }

    @Test
    public void set2() throws Exception {
    // 异步方式修改节点
        zookeeper.setData("/set/node2", "node21".getBytes(), -1,
                new AsyncCallback.StatCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx,
                                              Stat stat) {
                            // 0 代表修改成功
                        System.out.println(rc);
                            // 修改节点的路径
                        System.out.println(path);
                            // 上线文的参数对象
                        System.out.println(ctx);
                            // 的属性信息
                        System.out.println(stat.getVersion());
                    }
                },"I am Context");
        Thread.sleep(50000);
        System.out.println("结束");
    }
}

删除结点

// 同步方式
delete(String path, int version)
// 异步方式
delete(String path, int version, AsyncCallback.VoidCallback callBack,Object ctx)

path - znode路径。
version - znode的当前版本
callBack-异步回调接口
ctx-传递上下文参数

代码

package org.example;
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
public class ZKDelete {
    String IP = "10.10.108.71:2181";
    ZooKeeper zooKeeper;
    @Before
    public void before() throws Exception {
        final CountDownLatch countDownLatch = new CountDownLatch(1);
    // arg1:zookeeper服务器的ip地址和端口号
    // arg2:连接的超时时间 以毫秒为单位
    // arg3:监听器对象
                zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getState() == Event.KeeperState.SyncConnected)
                {
                    System.out.println("连接创建成功!");
                    countDownLatch.countDown();
                }
            }
        });
    // 使主线程阻塞等待
        countDownLatch.await();
    }
    @After
    public void after() throws Exception {
        zooKeeper.close();
    }
    @Test

    public void delete1() throws Exception {
        // arg1:删除节点的节点路径
        // arg2:数据版本信息 -1代表删除节点时不考虑版本信息
        zooKeeper.delete("/delete/node1",-1);
    }
    @Test
    public void delete2() throws Exception {
        // 异步使用方式
        zooKeeper.delete("/delete/node2", -1,
                new AsyncCallback.VoidCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx) {
                        // 0代表删除成功
                        System.out.println(rc);
                        // 节点的路径
                        System.out.println(path);
                        // 上下文参数对象
                        System.out.println(ctx);
                    }
                },"I am Context");
        Thread.sleep(10000);
        System.out.println("结束");
    }
}

查看结点

// 同步方式
getData(String path, boolean b, Stat stat)
// 异步方式
getData(String path, boolean b,AsyncCallback.DataCallback callBack,
Object ctx)

path - znode路径。
b- 是否使用连接对象中注册的监视器。
stat - 返回znode的元数据。
callBack-异步回调接口
ctx-传递上下文参数

代码

package org.example;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
public class ZKGet {
    String IP = "10.10.108.71:2181";
    ZooKeeper zooKeeper;
    @Before
    public void before() throws Exception {
        final CountDownLatch countDownLatch = new CountDownLatch(1);
    // arg1:zookeeper服务器的ip地址和端口号
    // arg2:连接的超时时间,以毫秒为单位
    // arg3:监听器对象
                zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getState() == Event.KeeperState.SyncConnected)
                {
                    System.out.println("连接创建成功!");
                    countDownLatch.countDown();
                }
            }
        });
    // 使主线程阻塞等待
        countDownLatch.await();
    }
    @After
    public void after() throws Exception {
        zooKeeper.close();
    }

    @Test
    public void get1() throws Exception {
    // arg1:节点的路径
    // arg3:读取节点属性的对象
        Stat stat=new Stat();
        byte [] bys=zooKeeper.getData("/get/node1",false,stat);
    // 打印数据
        System.out.println(new String(bys));
    // 版本信息
        System.out.println(stat.getVersion());
    }
    @Test
    public void get2() throws Exception {
    //异步方式
        zooKeeper.getData("/get/node1", false,
                new AsyncCallback.DataCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx,
                                              byte[] data, Stat stat) {
                            // 0代表读取成功
                        System.out.println(rc);
                            // 节点的路径
                        System.out.println(path);
                            // 上下文参数对象
                        System.out.println(ctx);
                            // 数据
                        System.out.println(new String(data));
                            // 属性对象
                        System.out.println(stat.getVersion());
                    }
                },"I am Context");
        Thread.sleep(10000);
        System.out.println("结束");
    }
}

查看子结点

// 同步方式
getChildren(String path, boolean b)
// 异步方式
getChildren(String path, boolean b,AsyncCallback.ChildrenCallback callBack,Object ctx)

path - Znode路径。
b- 是否使用连接对象中注册的监视器。
callBack - 异步回调接口。
ctx-传递上下文参数

代码

package org.example;
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ZKGetChid {
    String IP = "10.10.108.71:2181";
    ZooKeeper zooKeeper;
    @Before
    public void before() throws Exception {
        final CountDownLatch countDownLatch = new CountDownLatch(1);
        // arg1:zookeeper服务器的ip地址和端口号
        // arg2:连接的超时时间,以毫秒为单位
        // arg3:监听器对象
                zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getState() == Event.KeeperState.SyncConnected)
                {
                    System.out.println("连接创建成功!");
                    countDownLatch.countDown();
                }
            }
        });
        // 使主线程阻塞等待
        countDownLatch.await();
    }
    @After
    public void after() throws Exception {
        zooKeeper.close();
    }
    @Test
    public void get1() throws Exception {
        // arg1:节点的路径
        List<String> list = zooKeeper.getChildren("/get", false);
        for (String str : list) {
            System.out.println(str);
        }
    }
    @Test
    public void get2() throws Exception {
        // 异步用法
        zooKeeper.getChildren("/get", false, new
                AsyncCallback.ChildrenCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, List<String> children) {
                            // 0代表读取成功
                        System.out.println(rc);
                            // 节点的路径
                        System.out.println(path);
                            // 上下文参数对象
                        System.out.println(ctx);
                            // 子节点信息
                        for (String str : children) {
                            System.out.println(str);
                        }
                    }
                },"I am Context");
        Thread.sleep(10000);
        System.out.println("结束");
    }
}

查看结点是否存在

// 同步方法
exists(String path, boolean b)
// 异步方法
exists(String path, boolean b,AsyncCallback.StatCallback callBack,Object ctx)

path- znode路径。
b- 是否使用连接对象中注册的监视器。
callBack - 异步回调接口。
ctx-传递上下文参数

代码

package org.example;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;

public class ZKExists {
    String IP = "10.10.108.72:2181";
    ZooKeeper zookeeper;
    @Before
    public void before() throws Exception {
        final CountDownLatch countDownLatch = new CountDownLatch(1);
            // arg1:zookeeper服务器的ip地址和端口号
            // arg2:连接的超时时间,以毫秒为单位
            // arg3:监听器对象
                zookeeper = new ZooKeeper(IP, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getState() == Event.KeeperState.SyncConnected)
                {
                    System.out.println("连接创建成功!");
                    countDownLatch.countDown();
                }
            }
        });
        // 使主线程阻塞等待
        countDownLatch.await();
    }
    @After
    public void after() throws Exception {
        zookeeper.close();
    }

    @Test
    public void exists1() throws Exception {
        // arg1:节点的路径
        Stat stat = zookeeper.exists("/exists1", false);
        System.out.println(stat.getVersion());
    }

    @Test
    public void exists2() throws Exception {
        // 异步使用方式
        zookeeper.exists("/exists1", false, new
                AsyncCallback.StatCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, Stat stat) {
                        // 判断成功
                        System.out.println(rc);
                        // 路径
                        System.out.println(path);
                        // 上下文参数
                        System.out.println(ctx);
                        // null 节点不存在
                        System.out.println(stat.getVersion());
                    }
                }, "I am Context");
        Thread.sleep(5000);
        System.out.println("结束");
    }
}

总的来说zk的基本API不难,很容易看懂

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值