使用java api操作zookeeper

来源:互联网 发布:大数据课程培训大纲 编辑:程序博客网 时间:2024/05/21 14:00

创建maven项目,导入zookeeper相关包

<dependencies>    <dependency>        <groupId>org.apache.zookeeper</groupId>        <artifactId>zookeeper</artifactId>        <version>3.4.7</version>    </dependency>  </dependencies>

1、连接zookeeper

public class TestCase {    private static final String connectionString = "192.168.25.127:2181,"            + "192.168.25.129:2181,"            + "192.168.25.130:2181";    public static final Integer sessionTimeout = 2000;    public static ZooKeeper zkClient = null;    @Before    public void init() throws Exception{    //三个参数分别为连接的zookeeper集群服务器的ip,超时时间,监听器        zkClient = new ZooKeeper(connectionString, sessionTimeout, new Watcher(){            //收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)            public void process(WatchedEvent event) {                System.out.println(event.getType()+","+event.getPath());            }});    }

命令行查看

[zk: localhost:2181(CONNECTED) 1] ls /[app1, idea, test, servers, zookeeper]

2、创建数据节点到zk中

    @Test       public void createNode() throws Exception{        /*         * 传入四个参数         * 1、创建的节点         * 2、节点数据         * 3、节点的权限,OPEN_ACL_UNSAFE表示内部应用权限         * 4、节点类型,4种:持久化节点,带序列持久化节点,临时节点,带序列的临时节点         */        String path = zkClient.create("/idea",                 "helloworld".getBytes(),                 Ids.OPEN_ACL_UNSAFE,                 CreateMode.PERSISTENT);        System.out.println(path);    }

3、获取子节点

    @Test       public void getChildren()  throws Exception{        /*         * 传入2个参数         * 1、指定获取哪个节点的孩子         * 2、是否使用监听器(watcher),true表示使用以上的监听功能         */        List<String> children = zkClient.getChildren("/",true);        for (String child : children) {            System.out.println(child);        }        System.in.read();    }

控制台输出

None,nullapp1ideatestzookeeperservers

由于使用了监听功能,那么可以测试下监听功能
使用命令行删除掉节点/idea
控制台会继续输出

None,nullapp1ideatestzookeeperserversNodeChildrenChanged,/   继续输出的内容

但是如果再创建该节点,控制台不会再输出任何内容,这是因为监听是一次性的。监听到了删除节点的事件后便不能监听到创建节点。
为了能持续监听需要对监听处理逻辑做修改

public void process(WatchedEvent event) {                //收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)                System.out.println(event.getType()+"---"+event.getPath());            //为了能一直监听,调用一次注册一次                try {                    zkClient.getChildren("/", true);                } catch (Exception e) {                    e.printStackTrace();                }             }

4、判断节点是否存在

    @Test       public void testExist()  throws Exception{       //一个参数是节点,一个是是否用监听功能,Stat封装了该节点的相关信息比如:czxid,mzxid,ctime,mtime等        Stat stat = zkClient.exists("/idea", false);        System.out.println(stat==null?"不存在":"存在");    }

5、获取节点数据

    @Test       public void getData()  throws Exception{        byte[] data = zkClient.getData("/idea", false, null);        System.out.println(new String(data));    }

输出:

None,nullhelloworld

6、删除节点

    @Test       public void delete()  throws Exception{        //第一个参数为要删除的节点,第二个参数表示版本,-1表示所有版本        zkClient.delete("/idea",-1);    }

7、修改节点数据

    @Test    public void update() throws Exception{        //原 /idea节点的数据为helloworld        zkClient.setData("/idea", "zookeeper".getBytes(), -1);        //查看修改数据是否成功        byte[] data = zkClient.getData("/idea", false, null);        System.out.println(new String(data));    }

控制台输出:

None,nullzookeeper
原创粉丝点击