zookeeper中通过JavaAPI操作

步骤

  1. 创建maven项目
  2. 引入zookeeper编程依赖
<dependencies>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
    </dependency>
</dependencies>
  1. 编程使用

构建zookeeper连接

/**
 * 构建zookeeper连接需要传递三个参数
 * 1、connectString
 * 2、连接超时时间
 * 3、监听器的回调函数---监听器触发之后需要做的事情
 */
String connectString = "192.168.200.111:2181,192.168.200.112:2181,192.168.200.113:2181";
ZooKeeper zkClient = new ZooKeeper(connectString, 2000, new Watcher() {
    public void process(WatchedEvent event) {
        System.out.println(event.getPath() + "-" + event.getType());
    }
});

查看节点的数据

// 1. 查看节点的数据
// 字节数组就是我们节点的数据
Stat stat = new Stat();
byte[] data = zkClient.getData("/test", true, stat);
System.out.println(new String(data));
System.out.println(stat.getNumChildren());
System.out.println(stat.getDataLength());

查看子节点数据

// 2. 查看子节点(第一层)
List<String> children = zkClient.getChildren("/test0000000025", false);
System.out.println(children.toString());

创建子节点

/**
* 3. 创建子节点
* 参数1:子节点路径
* 参数2:子节点数据
* 参数3:子节点的权限--不需要关注
* 参数4:子节点的类型(四大类型)
* CreateMode.PERSISTENT
* CreateMode.PERSISTENT
* CreateMode.EPHEMERAL_SEQUENTIAL
* CreateMode.PERSISTENT_SEQUENTIAL
*/
String s = zkClient.create("/test0000000026/a", "balabala".getBytes(),
      ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);

阻塞主线程,一直处于监听的状态

/**
 * 构建zookeeper连接需要传递三个参数
 * 1、connectString
 * 2、连接超时时间
 * 3、监听器的回调函数---监听器触发之后需要做的事情
 */
String connectString = "192.168.200.111:2181,192.168.200.112:2181,192.168.200.113:2181";
zkClient = new ZooKeeper(connectString, 2000, new Watcher() {
    public void process(WatchedEvent event) {
        System.out.println("路径:" + event.getPath() + "----类型:" + event.getType());

        try {
            Stat stat = new Stat();
            byte[] data = zkClient.getData("/test", true, stat);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

/**
 * 让线程陷入阻塞,这样的话主线程无法结束,监听器才能执行
 */
Thread.sleep(Long.MAX_VALUE);

完整代码

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.List;

/**
 * 2181 对客户端提供服务的端口
 * 2888 leader与follower通讯使用
 * 3888 选举leader
 */
/*
 * zookeeper如果我们需要通过代码操作,此时代码就相当于是一个客户端。客户端首先需要和zookeeper服务端建立连接
 */
public class Demo {
    static ZooKeeper zkClient = null;
    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        /**
         * 构建zookeeper连接需要传递三个参数
         * 1、connectString
         * 2、连接超时时间
         * 3、监听器的回调函数---监听器触发之后需要做的事情
         */
        String connectString = "192.168.200.111:2181,192.168.200.112:2181,192.168.200.113:2181";
        zkClient = new ZooKeeper(connectString, 2000, new Watcher() {
            public void process(WatchedEvent event) {
                System.out.println("路径:" + event.getPath() + "----类型:" + event.getType());

                try {
                    Stat stat = new Stat();
                    byte[] data = zkClient.getData("/test", true, stat);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // 1. 查看节点的数据
        // 字节数组就是我们节点的数据
        Stat stat = new Stat();
        byte[] data = zkClient.getData("/test", true, stat);
        System.out.println(new String(data));
        System.out.println(stat.getNumChildren());
        System.out.println(stat.getDataLength());

        System.out.println("-----查看子节点-----");
        // 2. 查看子节点(第一层)
        List<String> children = zkClient.getChildren("/test0000000025", false);
        System.out.println(children.toString());

        /**
         * 3. 创建子节点
         * 参数1:子节点路径
         * 参数2:子节点数据
         * 参数3:子节点的权限--不需要关注
         * 参数4:子节点的类型(四大类型)
         * CreateMode.PERSISTENT
         * CreateMode.PERSISTENT
         * CreateMode.EPHEMERAL_SEQUENTIAL
         * CreateMode.PERSISTENT_SEQUENTIAL
         */
        String s = zkClient.create("/test0000000026/a", "balabala".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(s);

        /**
         * 让线程陷入阻塞,这样的话主线程无法结束,监听器才能执行
         */
       Thread.sleep(Long.MAX_VALUE);
    }
}
posted @ 2022-09-06 17:10  jsqup  阅读(56)  评论(0编辑  收藏  举报