Zookeeper Java API 实例

Zookeeper Java API 实例

Api介绍

表 1 org.apache.zookeeper. ZooKeeper 方法列表


除了以上这些上表中列出的方法之外还有一些重载方法,如都提供了一个回调类的重载方法以及可以设置特定 Watcher 的重载方法,具体的方法可以参考 org.apache.zookeeper. ZooKeeper 类的 API 说明。

英文版: https://zookeeper.apache.org/doc/r3.4.2/api/index.html

实例

public class MyZk implements Watcher {

    public void process(WatchedEvent watchedEvent) {

        System.out.println("触发了" + watchedEvent.getType() + "事件!");

    }

}

package com.mylearn.zookeeper.test;

import IceUtilInternal.StringUtil;

import com.jd.common.util.ArrayUtils;

import org.apache.cxf.common.util.StringUtils;

import org.apache.zookeeper.*;

import org.apache.zookeeper.data.ACL;

import org.apache.zookeeper.data.Stat;

import java.io.IOException;

import java.util.List;

/**

 * Created by IntelliJ IDEA.

 * User: yingkuohao

 * Date: 13-11-26

 * Time: 上午8:57

 * CopyRight:360buy

 * Descrption:

 * zk java api测试

 * To change this template use File | Settings | File Templates.

 */

public class ZkApi {

    private static String server = "192.168.229.79:";

    private static String port = "2181";

    private static final int SESSION_TIMEOUT = 10000;

    private static ZooKeeper zk = null;

    public static void main(String args[]) {

        ZkApi testzkApi = new ZkApi();

        Watcher watcher = new MyZk();

//        ZooKeeper zk =testzkApi.init(server + port, ClientBase.CONNECTION_TIMEOUT); //创建zk对象

        zk = testzkApi.init(server + port, SESSION_TIMEOUT, watcher); //创建zk对象

        String parentPath = "/testParentPath";        //节点路径 ,the path for the node

        String testParentData = "testParentData";       //  节点初始化数据,the initial data for the node

        List<ACL> aclList = ZooDefs.Ids.OPEN_ACL_UNSAFE; //节点的权限 the acl for the node

//        CreateMode createMode = CreateMode.EPHEMERAL;  //临时节点,一旦创建这个节点的客户端与服务端端口session超时,这种节点会被自动删除。

        CreateMode createMode = CreateMode.PERSISTENT;  //持久节点,这个目录节点存储的数据不会丢失。

        try {

            createNod(parentPath, testParentData, aclList, createMode);

            String parentData = new String(zk.getData(parentPath, false, null));//读取付父节点内容,getData方法

            System.out.println("parentData=" + parentData);

            String childPath1 = parentPath + "/testChildPath1";

            String childData1 = "testChildData1";

            createNod(childPath1, childData1, aclList, createMode);//创建子目录 1

            String childDataPop = new String(zk.getData(childPath1, false, null));//读取子节点内容

            System.out.println("childData1=" + childDataPop);

            String childPath2 = parentPath + "/testChildPath2";

            String childData2 = "testChildData2";

            createNod(childPath2, childData2, aclList, createMode);//创建子目录2

            //创建另一个父节点

            String parentPath2 = "/testParentPath2";

            String testParentData2 = "testParentData2";

            createNod(parentPath2, testParentData2, aclList, createMode);

            listNode("/");

            listNode(parentPath);

            Stat stat = zk.exists(parentPath, false);

            List<ACL> rootAcl = zk.getACL(parentPath, stat);   //获取某个目录节点的访问权限列表。

            System.out.println("节点权限:" + ArrayUtils.join(rootAcl.toArray(), ",")+"节点版本:"+stat.getVersion());

            zk.setACL(parentPath,ZooDefs.Ids.READ_ACL_UNSAFE,stat.getVersion());

            System.out.println("节点权限:" + ArrayUtils.join( zk.getACL(parentPath, stat).toArray(), ","));

            deleteNode("/testChildPath");

            deleteNode(parentPath); //父目录下有子节点,不能直接删除,会报错: KeeperErrorCode = Directory not empty for /testParentPath

            listNode("/");

        } catch (KeeperException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        } catch (InterruptedException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }

    }

    /**

     * 删除节点

     * @param path

     * @throws KeeperException

     * @throws InterruptedException

     */

    private static void deleteNode(String path) throws KeeperException, InterruptedException {

        Stat stat = zk.exists(path, true);

        if (stat != null) {

            zk.delete(path, -1);  //-1可以匹配任何版本,也就删除了这个目录节点所有数据,

            System.out.println("删除" + path + "节点成功");

            listNode(path);

        } else {

            System.out.println(path + "节点不存在");

        }

    }

    /**

     * 打印节点信息

     * @param path

     * @throws KeeperException

     * @throws InterruptedException

     */

    private static void listNode(String path) throws KeeperException, InterruptedException {

        List<String> nodeList = zk.getChildren(path, false); //获取孩子节点

        System.out.println(path + "路径下的节点" + ArrayUtils.join(nodeList.toArray(), ","));

    }

    /**

     * 创建节点

     *

     * @param nodePath   节点路径

     * @param nodeData   节点初始化数据

     * @param aclList    权限列表

     * @param createMode 节点类型

     * @throws KeeperException

     * @throws InterruptedException

     */

    private static void createNod(String nodePath, String nodeData, List<ACL> aclList, CreateMode createMode) {

        try {

            Stat stat = zk.exists(nodePath, true);

            if (stat != null) {

                //如两次执行 EPHEMERAL节点,就不会执行这段代码,因为每次都会清除;而 PERSISTENT节点,创建一次后就会一直存在,除非手动删除

                System.out.println("节点" + nodePath + "已存在!");

            } else {

                zk.create(nodePath, nodeData.getBytes(), aclList, createMode);//创建节点 ,create方法

            }

        } catch (KeeperException e) {

            e.printStackTrace();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

    /**

     * 初始化zk

     * @param path

     * @param timeOut

     * @param watcher

     * @return

     */

    public ZooKeeper init(String path, int timeOut, Watcher watcher) {

        if (zk == null) {

            try {

                zk = new ZooKeeper(path, timeOut, watcher);

            } catch (IOException e) {

                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

            }

        }

        return zk;

    }

}

参考:

https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值