Zookeeper API

Zookeeper API可以实现zookeeper客户端对节点的各种交互,所以我们只需要记住这一个zookeeper()入口即可,对每种方法提供了同步和异步两种方式

  • 同步:有返回值,且需要抛异常
  • 异步:无返回值,不需要关注异常,会通过返回状态码进行判断

Result Code

  • 0 (ok) :接口调用成功
  • -4 (ConnectionLoss) :客户端和服务端连接断开
  • -110 (NodeExists) :节点已存在
  • -112 (SessionExpired) :会话已过期
同步创建节点
  • 参数说明
     * @param path
     *                the path for the node
     * @param data
     *                the initial data for the node
     * @param acl
     *                the acl for the
      提供的默认权限:
      OPEN_ACL_UNSAFE:完全开放
      /**源码注释
         * This is a completely open ACL 
         */
      CREATOR_ALL_ACL:创建者拥有该节点所有权限
      /**源码注释
         * This ACL gives the creators authentication id's all permissions.
         */
      READ_ACL_UNSAFE:所有客户端可读
              /**源码注释
         * This ACL gives the world the ability to read.
         */
     node
     * @param createMode
     *                specifying whether the node to be created is ephemeral
     *                and/or sequential
    PERSISTENT :永久节点
    PERSISTENT_SEQUENTIAL:永久序列节点 
    EPHEMERAL :临时节点
    EPHEMERAL_SEQUENTIAL:临时序列节点
    
    
    public String create(final String path, byte data[], List<ACL> acl,
            CreateMode createMode)
  • 完整代码
package com.ruozedata.bigdata.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

public class zkAPI implements Watcher{
    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
    public static void main(String[] args) throws Exception {
       createZnode();

    }

    //同步创建节点
    private static void createZnode() throws IOException, KeeperException, InterruptedException {
        ZooKeeper zk = new ZooKeeper("hadoop001:2181", 5000, null);
        System.out.println("连接状态:"+zk.getState());
        connectedSemaphore.await();
        System.out.println("连接状态:"+zk.getState());
        String create = zk.create("/test", "12345".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建节点:"+create);
    }
    
        @Override
    public void process(WatchedEvent event) {
        System.out.print(String.valueOf(event));
    }
}
异步创建节点
public void create(final String path, byte data[], List<ACL> acl,
            CreateMode createMode,  StringCallback cb, Object ctx)

可以看到异步创建比同步多了两个参数

  • StringCallback cb:

该参数需要实现AsyncCallback.StringCallback()接口,并且需要实现此接口的processResult方法

new AsyncCallback.StringCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, String name) {
                System.out.print( rc + ", " + path + ", " + ctx + ", real path name: " + name);
            }

int rc:返回的状态码,见文章开始的异步返回状态吗描述,所以可以根据获取的此状态码用if或者switch翻译为相应的标识符
String path:接口调用时传入的API的数据节点的节点路径参数值
Object ctx:接口调用时传入的API的ctx参数值
String name:节点的真实名称
  • Object ctx:

该参数可以自己定义内容

  • 完整代码
package com.ruozedata.bigdata.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

public class zkAPI implements Watcher{
    private static Logger logger = LoggerFactory.getLogger(zkAPI.class);
    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
    public static void main(String[] args) throws Exception {
        asyncCreateZnode();
    }
    
     //异步创建节点
    private static void asyncCreateZnode() throws Exception {
        ZooKeeper zk = new ZooKeeper("hadoop001:2181", 3000, new zkAPI());
        logger.info("连接状态:"+zk.getState());
        Thread.sleep(1000);
        logger.info("连接状态:"+zk.getState());
        zk.create("/test1234", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, String name) {
                logger.info("Create path result: [" + rc + ", " + path + ", " + ctx + ", real path name: " + name);
            }
        }, "SUCCESS");
        Thread.sleep(1000);
    }
    
        @Override
    public void process(WatchedEvent event) {
        logger.info(String.valueOf(event));
    }
}

欢迎关注公众号,一起愉快的交流
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值