zookeeper三:zkClient的使用

在生产环境中常常会遇到session exprie这类异常,需要在发生异常以后重新连接,重新建立session,直接使用ZooKeeperAPI 实现的话,可能会比较麻烦。而且ZooKeeper的watcher是一次性的。如果基于watcher做发布/订阅模式,需要做额外的一些编码。以实现每次watcher失效后重新注册,将一次性订阅包装成持久订阅。并且,ZooKeeper的API接口中,节点数据默认为二进制byte数组。如果想直接保存为对象类型的数据,需要对对象转换为二进制类型,也就是进行序列化相关的工作。这里介绍一个ZooKeeper的第三方工具包,zkClient,可以较好的解决上述存在的问题。
zkClient解决了watcher的一次性注册问题,将znode的事件重新定义为子节点的变化、数据的变化、连接及状态的变化这三类。由zkClient统一将watcher的WatchedEvent转换到以上三种情况去处理。watcher执行后重新读取数据的同时,将再注册相同的watcher。zkClient在发生session expire异常时会自动创建新的ZooKeeper实例重连。这时所有的watcher和EPHEMERAL节点都将失效,可以在zkClient定义的连接状态变化的接口 IzkStateListener里面的handleNewSession方法中进行相应的处理。同时,zkClient还提供了ZKSerializer接口,可进行序列化和反序列话操作。
关于zkclient获取方式:
zkclient是github上的开源项目,git之提供源码,用户需要将其打包成jar文件
1)从git上下载源码:https://github.com/sgroschupf/zkclient.git
2)在eclipse中建立java工程,并将src和lib导入eclipse
3)使用elipse的export导出为jar包

在使用zkClient之前,需要先实例化一个zkClient对象,指定ZooKeeper服务器的地址列表,zkClient对ZooKeeper的基本API做了一些封装,使用起来更加简单:

ZkClient zkClient = new ZkClient(serverList);
        //一些简单的实例
        //创建节点
        zkClient.createPersistent(path);
        //创建子节点
        zkClient.create(path, data, mode);
        //获得子节点
        List<String> children = zkClient.getChildren(path);
        //获得子节点个数
        int childCount = zkClient.countChildren(path);
        //判断节点是否存在
        zkClient.exists(path);
        //写入数据
        zkClient.writeData(path, object);
        //读取节点数据
        Object obj = zkClient.readData(path);
        //删除节点
        zkClient.delete(path);

zkClient将ZooKeeper的watcher机制转换为一种更容易理解的订阅形式,并且这种关系是可以保持的。而非一次性的。也就是说,当watcher使用完后,zkClient会自动再增加一个相同的watcher。节点有三种状态可供订阅,一类是子节点的变化,一类是数据的变化,还有一类是状态的变化。

        //订阅子节点变化
        zkClient.subscribeChildChanges(PATH, new IZkChildListener() {
            @Override
            public void handleChildChange(String arg0, List arg1) throws Exception {
            }
        });
        //订阅数据变化
        zkClient.subscribeDataChanges(PATH, new IZkDataListener() {
            @Override
            public void handleDataDeleted(String arg0) throws Exception {

            }
            @Override
            public void handleDataChange(String arg0, Object arg1) throws Exception {

            }
        });
        //订阅连接数变化
        zkClient.subscribeStateChanges(new IZkStateListener() {
            @Override
            public void handleStateChanged(KeeperState arg0) throws Exception {
                // TODO Auto-generated method stub

            }
            @Override
            public void handleSessionEstablishmentError(Throwable arg0) throws Exception {
                // TODO Auto-generated method stub

            }
            @Override
            public void handleNewSession() throws Exception {
                // TODO Auto-generated method stub
            }
        });

你可能感兴趣的:(zookeeper学习笔记)