zookeeper系列二:zookeeper的api编程

pom依赖

根据自己的zookeeper版本填写 version,本地使用的zookeeper版本为3.4.6

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

 

测试各种类型代码如下

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.CountDownLatch;


public class ZooKeeperApp implements Watcher {

    private static Logger logger = LoggerFactory.getLogger(ZooKeeperApp.class);

    private static CountDownLatch connected = new CountDownLatch(1);

    public static void main(String[] args) throws Exception {
        ZooKeeper zk = new ZooKeeper("hadoop:2181", 5000, new ZooKeeperApp());


        logger.warn("客户端开始连接zookeeper服务器");
        logger.warn("连接状态:{}", zk.getState());


        connected.await();//执行到此处挂起,直到连接上往下走


        logger.warn("连接状态:" + zk.getState());

        createTmpNode(zk);
        createTmpNodeCallBack(zk);
        updataNode(zk);
        deleteNode(zk);
        getNode(zk);
        isExists(zk);
        getChildrenNode(zk);
    }

    @Override
    public void process(WatchedEvent watchedEvent) {

        if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
            logger.warn("接收到watch通知:{}", watchedEvent);
            connected.countDown();
        }

    }

    //同步创建临时节点
    private static void createTmpNode(ZooKeeper zk) throws Exception {

        String path1 = zk.create("/zk-test-eph", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        logger.warn("创建节点成功:{}", path1);

        Thread.sleep(100000);
        /**
         * 在命令行工具可以看到刚刚创建的临时节点,注意,临时节点一定要让java在执行状态,否则进程停止后,临时节点小时
         *        WATCHER::
         *
         *         WatchedEvent state:SyncConnected type:None path:null
         *         [zk: localhost:2181(CONNECTED) 0] ls /
         *         [zookeeper, zk-test-eph]
         *         [zk: localhost:2181(CONNECTED) 1] get /zk-test-eph
         *         1
         *         cZxid = 0x14
         *         ctime = Mon Sep 30 17:14:24 CST 2019
         *         mZxid = 0x14
         *         mtime = Mon Sep 30 17:14:24 CST 2019
         *         pZxid = 0x14
         *         cversion = 0
         *         dataVersion = 0
         *         aclVersion = 0
         *         ephemeralOwner = 0x16d816a608c0007
         *         dataLength = 1
         *         numChildren = 0
         *         [zk: localhost:2181
         */
    }

    /**
     * 异步创建ZK节点
     * 注意,异步的创建为了查看效果,务必要让进程睡一会
     * 否则,因为是异步调用,java进程执行过程中,不会等待结果,直接执行完成。
     */
    private static void createTmpNodeCallBack(ZooKeeper zk) throws Exception {

        String ctx = "{'create':'success'}";
        zk.create("/zk-test-eph", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,
                new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        logger.warn("创建节点成功:{}", name);
                    }
                },
                ctx
        );

        Thread.sleep(100000);
    }

    /**
     * 修改节点信息
     * setdata函数,正常情况需要指定节点的版本,否则将无法修改成功
     * 当我们将版本指定为-1的时候,就可以不用指定版本直接进行修改
     */
    private static void updataNode(ZooKeeper zk) throws Exception {
        Stat stat = zk.setData("/test", "udpata-test".getBytes(), -1);
        logger.warn("版本号:{}", stat.getVersion());

        Thread.sleep(100000);
    }

    /**
     * 删除节点
     * delete,正常情况需要指定节点的版本,否则将无法删除成功
     * 当我们将版本指定为-1的时候,就可以不用指定版本直接进行删除
     * 注意,delete函数无返回值
     */
    private static void deleteNode(ZooKeeper zk) throws Exception {

        zk.delete("/test/test-delete", -1);
    }


    /**
     * zookeeper在创建节点时,务必保障子节点是存在的
     * 但是我们可以通过
     */
    private static void createPNode(ZooKeeper zk) throws Exception {
        String path1 = zk.create("/zk-test-eph/a/b/c", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        logger.warn("创建节点成功:{}", path1);

        Thread.sleep(100000);
    }

    private static void getNode(ZooKeeper zk) throws Exception {

        Stat stat = new Stat();
        byte[] data = zk.getData("/test", true, stat);
        logger.warn("获取节点数据:{}", new String(data));
        logger.warn("获取节点版本号:{}", stat.getVersion());
    }

    private static void isExists(ZooKeeper zk) throws Exception {

        Stat stat = zk.exists("/test", true);

        if (null != stat) {
            logger.warn("节点存在");
        } else {
            logger.warn("节点不存在");
        }
    }

    private static void getChildrenNode(ZooKeeper zk) throws Exception {
        List<String> children = zk.getChildren("/test", true);

        for (String child : children) {
            logger.warn(child);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值