• 创建会话
 package org.zln.zk;

 import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper; import java.io.IOException; /**
* Created by sherry on 16/8/27.
*/
public class TestZooKeeperClientApi { private static ZooKeeper zooKeeper; public static void main(String[] args) throws IOException, InterruptedException {
createSession();
} /**
* 创建会话
*/
private static ZooKeeper createSession() throws IOException, InterruptedException {
//实例化的过程,同时也是与ZooKeeper建立连接的过程,参数说明:ip:port 超时时间 监听器(实现water接口,监听器用于接收通知)
zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("收到事件:"+watchedEvent);//收到事件:WatchedEvent state:SyncConnected type:None path:null //TODO
}
});
System.out.println("查看状态:"+zooKeeper.getState());//查看状态:CONNECTING //如果不停一段时间,那么,监听器还没收到监听,方法就已经退出了
Thread.sleep(5000); return zooKeeper; }
}

创建会话

  • 创建节点
 package org.zln.zk;

 import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList; /**
* Created by sherry on 16/8/27.
*/
public class TestZooKeeperClientApi { private static Logger logger = LoggerFactory.getLogger(TestZooKeeperClientApi.class); private static ZooKeeper zooKeeper; public static void main(String[] args) throws IOException, InterruptedException {
createSession();
} /**
* 创建会话
*/
private static ZooKeeper createSession() throws IOException, InterruptedException {
//实例化的过程,同时也是与ZooKeeper建立连接的过程,参数说明:ip:port 超时时间 监听器(实现water接口,监听器用于接收通知)
zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
//TODO 与 ZooKeeper 的交互,一般都放在这里
if (watchedEvent.getState() == Event.KeeperState.SyncConnected){//已连接
logger.info("连接上了"); try {
//参数说明:节点路径 数据的字节数组 权限 创建节点模式
String nodePath = createNode(zooKeeper,"/node_1","123".getBytes("UTF-8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
logger.info("创建节点:"+nodePath);
} catch (UnsupportedEncodingException|KeeperException|InterruptedException e) {
e.printStackTrace();
} }
}
});
logger.info("查看状态:"+zooKeeper.getState());//查看状态:CONNECTING //如果不停一段时间,那么,监听器还没收到监听,方法就已经退出了
Thread.sleep(5000); return zooKeeper; } /**
* 创建ZooKeeper节点
* @param zooKeeper ZooKeeper连接
* @return 节点路径
*/
public static String createNode(ZooKeeper zooKeeper, String path, byte[] bytes, ArrayList<ACL> acls,CreateMode createMode) throws UnsupportedEncodingException, KeeperException, InterruptedException {
//参数说明:节点路径 数据的字节数组 权限 创建节点模式
return zooKeeper.create(path,bytes, acls, createMode);
}
}

创建节点

创建模式

PERSISTENT          持久节点
PERSISTENT_SEQUENTIAL  
持久顺序节点
EPHEMERAL          临时节点
EPHEMERAL_SEQUENTIAL   临时顺序节点

以上代码,是属于同步创建

 /**
* 异步创建节点
* @param zooKeeper
* @param path
* @param bytes
* @param acls
* @param createMode
* @throws KeeperException
* @throws InterruptedException
*/
public static void asCreateNode(ZooKeeper zooKeeper, String path, byte[] bytes, ArrayList<ACL> acls,CreateMode createMode) throws KeeperException, InterruptedException { //异步创建需要增加 AsyncCallback.StringCallback 接口的实现类 以及 一个上下文对象参数
zooKeeper.create(path, bytes, acls, createMode, new AsyncCallback.StringCallback() {
/**
*
* @param rc 节点创建结果返回码 0-节点创建成功
* @param path 节点真实路径
* @param ctx 异步调用上下文 就是 create方法本地调用的那个最后一个参数
* @param name
*/
@Override
public void processResult(int rc, String path, Object ctx, String name) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("\nrc="+rc+"\n" +
"path="+path+"\n" +
"ctx="+ctx+"\n" +
"name="+name+"\n");
logger.info(stringBuilder.toString());
}
},"异步创建");
}

异步方式创建节点

  • 获取子节点
     /**
* 同步方式获取子节点
* @param zooKeeper 连接
* @param parentPath 父路径
* @return
* @throws KeeperException
* @throws InterruptedException
*/
public static List<String> getChildList(ZooKeeper zooKeeper,String parentPath) throws KeeperException, InterruptedException {
//参数说明: 父节点路径 是否需要关注子节点的变化
List<String> childs = zooKeeper.getChildren(parentPath,false);
return childs;
}

同步方式获取子节点且不关注子节点的变化

异步方式获取子节点且关注子节点的变化
     /**
* 异步方式获取子节点 关注子节点变化
* @param zooKeeper 连接
* @param parentPath 父路径
*/
public static void asGetChildListAndWatch(ZooKeeper zooKeeper,String parentPath){
zooKeeper.getChildren(parentPath, true, new AsyncCallback.Children2Callback() {
@Override
public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
logger.info("变化后的子节点:");
for (String name:children){
logger.info("子节点:"+name);
}
}
},"关注子节点变化");
}

AsyncCallback.Children2Callback接口实现异步关注

目前为止可以发现这个规律,有回调函数的是异步方式调用,没有回调函数的是同步调用

问:同步调用和异步调用的使用场景是???

答:下面的操作依赖调用结果的时候,就需要调用同步方法

 package org.zln.zk;

 import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List; /**
* Created by sherry on 16/8/27.
*/
public class TestZooKeeperClientApi { private static Logger logger = LoggerFactory.getLogger(TestZooKeeperClientApi.class); private static ZooKeeper zooKeeper; public static void main(String[] args) throws IOException, InterruptedException {
createSession(); Thread.sleep(Integer.MAX_VALUE);
} /**
* 创建会话
*/
private static ZooKeeper createSession() throws IOException, InterruptedException {
//实例化的过程,同时也是与ZooKeeper建立连接的过程,参数说明:ip:port 超时时间 监听器(实现water接口,监听器用于接收通知)
zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
//TODO 与 ZooKeeper 的交互,一般都放在这里
if (watchedEvent.getState() == Event.KeeperState.SyncConnected){//已连接
logger.info("连接上了");
try {
//同步方式创建节点
//String nodePath = sysCreateNode(zooKeeper,"/node_1","123".getBytes("UTF-8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//logger.info("创建节点:"+nodePath); //异步方式创建节点
//asCreateNode(zooKeeper,"/node_2","234".getBytes("UTF-8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //同步方式获取子节点 不关注子节点变化
// List<String> list = getChildListNoWatch(zooKeeper,"/");
// for (String name:list){
// logger.info("子节点:"+name);
// } //异步方式获取节点 关注子节点变化
// asGetChildListAndWatch(zooKeeper,"/"); //同步方式获取节点数据 sysGetNodeData byte[] bytes = sysGetNodeDataNoWatch(zooKeeper,"/node_1");
logger.info("获取节点数据"+new String(bytes,"UTF-8")); deleteNode(zooKeeper,"/node_1",0);
} catch (KeeperException|InterruptedException|UnsupportedEncodingException e) {
e.printStackTrace();
} }
}
});
logger.info("查看状态:"+zooKeeper.getState());//查看状态:CONNECTING return zooKeeper; } /**
* 同步创建节点
* @param zooKeeper 连接
* @param path 节点路径
* @param bytes 字节数组数据
* @param acls 权限
* @param createMode 创建模式
* @return
* @throws UnsupportedEncodingException
* @throws KeeperException
* @throws InterruptedException
*/
public static String sysCreateNode(ZooKeeper zooKeeper, String path, byte[] bytes, ArrayList<ACL> acls,CreateMode createMode) throws UnsupportedEncodingException, KeeperException, InterruptedException {
return zooKeeper.create(path,bytes, acls, createMode);
} /**
* 异步创建节点
* @param zooKeeper 连接
* @param path 节点路径
* @param bytes 字节数组数据
* @param acls 权限
* @param createMode 创建模式
* @throws KeeperException
* @throws InterruptedException
*/
public static void asCreateNode(ZooKeeper zooKeeper, String path, byte[] bytes, ArrayList<ACL> acls,CreateMode createMode) throws KeeperException, InterruptedException { //异步创建需要增加 AsyncCallback.StringCallback 接口的实现类 以及 一个上下文对象参数
zooKeeper.create(path, bytes, acls, createMode, new AsyncCallback.StringCallback() {
/**
*
* @param rc 节点创建结果返回码 0-节点创建成功
* @param path 节点真实路径
* @param ctx 异步调用上下文 就是 create方法本地调用的那个最后一个参数
* @param name
*/
@Override
public void processResult(int rc, String path, Object ctx, String name) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("\nrc="+rc+"\n" +
"path="+path+"\n" +
"ctx="+ctx+"\n" +
"name="+name+"\n");
logger.info(stringBuilder.toString());
}
},"异步创建");
} /**
* 同步方式获取子节点 不关注子节点变化
* @param zooKeeper 连接
* @param parentPath 父路径
* @return
* @throws KeeperException
* @throws InterruptedException
*/
public static List<String> sysGetChildListNoWatch(ZooKeeper zooKeeper,String parentPath) throws KeeperException, InterruptedException {
//参数说明: 父节点路径 是否需要关注子节点的变化 如果 true,则子节点发生变化后,会产生 NodeChildrenChanged 事件
List<String> childs = zooKeeper.getChildren(parentPath,false);
return childs;
} /**
* 异步方式获取子节点 关注子节点变化
* @param zooKeeper 连接
* @param parentPath 父路径
*/
public static void asGetChildListAndWatch(ZooKeeper zooKeeper,String parentPath){
zooKeeper.getChildren(parentPath, true, new AsyncCallback.Children2Callback() {
@Override
public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
logger.info("变化后的子节点:");
for (String name:children){
logger.info("子节点:"+name);
}
}
},"关注子节点变化");
} /**
* 同步方式获取数据
* @param zooKeeper
* @param path
* @return
* @throws KeeperException
* @throws InterruptedException
*/
public static byte[] sysGetNodeDataNoWatch(ZooKeeper zooKeeper,String path) throws KeeperException, InterruptedException {
//路径 是否关注数据变化 状态
return zooKeeper.getData(path,false,new Stat());
} /**
* 删除节点
* @param zooKeeper
* @param nodePath
* @param version
* @throws KeeperException
* @throws InterruptedException
*/
public static void deleteNode(ZooKeeper zooKeeper,String nodePath,int version) throws KeeperException, InterruptedException {
zooKeeper.delete(nodePath,version);
} }

客户端代码汇总

除了ZooKeeper提供的Java API外,还有两种客户端,ZKClient和Curator两种客户端,都是对原生API的封装,使得操作更方便

《从PAXOS到ZOOKEEPER分布式一致性原理与实践》,可以参考这本书

Java API操作ZooKeeper的更多相关文章

  1. 六、Java API操作zookeeper节点

    目录 前文 pom.xml文件增加依赖 新建java文件:ZookeeperTest GitHub文件下载 前文 一.CentOS7 hadoop3.3.1安装(单机分布式.伪分布式.分布式 二.JA ...

  2. Java API 操作Zookeeper

    一.依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...

  3. zookeeper的java api操作

    zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...

  4. Java curator操作zookeeper获取kafka

    Java curator操作zookeeper获取kafka Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更 ...

  5. hadoop2-HBase的Java API操作

    Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...

  6. java api操作

    java api操作 导入开发包 将hbase安装包中lib下包导入java项目   创建表   Configuration conf = HBaseConfiguration.create(); c ...

  7. hive-通过Java API操作

    通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...

  8. 使用Java API操作HDFS文件系统

    使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...

  9. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

随机推荐

  1. pycharm中常用设置

    当安装时检查版本过低 首先 pip --help 进入帮助,找到 复制,然后 pip install --disable-pip-version-check 要安装的包 这样就会跳过版本检测. 在py ...

  2. EBS R12中FND凭证打印警告:OPP响应超时

    接近年关,最近年结忙的飞起,此为背景,今天运维那边反应日记账凭证打印报错,看了下后台请求发现请求有警告. 查看日志发现报了“并发:OPP响应超时”的警告,这个地方响应超时可能是配置文件中“并发:OPP ...

  3. java异常处理 throw RuntimeException时不需要同时方法中声明抛出throws 异常等待调用者catch进行捕获 子父类异常问题

    package com.swift.exception1; public class Demo_Exception { public static void main(String[] args) { ...

  4. 第34-2题:LeetCode113. Path Sum II

    题目 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ ...

  5. 【模板时间】◆模板·III◆ 单调子序列

    ◆模板·III◆ 单调子序列 以前只知道DP用 O(n2) 的做法,现在才发现求单调子序列方法好多…… ◇ 模板简述 单调子序列包括 升序/降序/非升序/非降序 子序列.主要题型如下: ①在原串中找到 ...

  6. UVA_1434_YAPTCHA

    The math department has been having problems lately. Due to immense amount of unsolicited automated ...

  7. c#字符显示转换{0:d} string.Format()

    这一篇实际和前几个月写的没什么本质上的区别.但是这篇更明确一点,学起来easy c#字符显示转换{0:d} C#:String.Format数字格式化输出 : int a = 12345678; // ...

  8. rsync同步备份搭建

    Rsync 是 Unix/Linux 下的一款应用软 在平常的运维中进常要对一些数据进行备份,以防止意外的服务器故障导致不可避免的后果,tar,cp只能适应一些小范围backup,对于几T甚至几P的数 ...

  9. js如何获得系统时间年月日时分秒

    javascript 自带有个对象(构造函数),Date().下面是代码: 回答一: var now = new Date();  var nowTime = now.toLocaleString() ...

  10. windows下使用curl.exe模拟ajax请求

    curl 是一般linux发行版中都带有的小工具,利用这个工具可以很方便的下载文件,我一般使用这个工具来查看某个页面相应的HTTP头信息,在Windows系统中我们也一样可以使用这个工具,如果不需要支 ...