一、依赖

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
<type>pom</type>
</dependency>

二、API介绍

1.创建会话

1) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
2) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)
3) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd)
4) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) 客户端与服务端回话的创建是一个异步的过程:
1) 完成客户端的初始化就返回,此时连接并没有真正的建立起来。
2) 当连接真正建立后,客户端会收到一个时间通知。
ZK构造方法参数说明
connectString:指zk的服务器列表,以英文输入法下逗号分割的host:port,比如192.168.2.14:2181,192.168.1.15:2181
sessionTimeout:会话超时时间,单位是毫秒ͺ当在这个时间内没有收到心跳检测,会话就会失效
watcher:注册的watcher,null表示不设置
canBeReadOnly:用于标识当前会话是否支持"read-only"模式
sessionId:会话ID
sessionPasswd:会话密钥

2.创建节点

#同步创建节点
1) String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
#异步创建节点
2) void create(String path, byte[] data,List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback cb, Object ctx); 以上创建方法都不支持递归创建节点,当节点存在时抛出异常NodeExistsException
ZK create api参数说明
path:被创建的节点路,比如:/zoo/tiger
data[]:节点数据
acl:Acl策略
createMode:节点类型,枚举类型,有四种选择
持久 PERSISTEN
持久顺序 PERSISTENT_SEQUENTIAL
临时 EPHEMERAL
临时顺序 EPHEMERAL_SEQUENTIAL
cb:异步回调函数,需要实现StringCallback接口,当服务端创建完成后,客户端会自动调用这个对象的processResult方法
ctx:用于传递一个对象,可以在回调方法执行的时候用,通常用于传递业务的上下文信息

3.删除节点

 #同步删除节点
1) void delete(String path, int version);
#异步删除节点
2) void delete(String path, int version, AsyncCallback.VoidCallback cb, Object ctx);
ZK delete api参数说明
path:被删除的节点路径
version:知道节点的数据版本,如果指定的版本不是最新版本,将会报错,它的作用类似于hibernate中的乐观锁
cb:异步回调函数
ctx:上下文信息

4.获取子节点

#返回子节点
1) List<String> getChildren(String path, boolean watch)
#返回子节点和stat
2) List<String> getChildren(String path, boolean watch, Stat stat)
#异步方式返回子节点,返回path指定节点的状态信息(stat)
3) void getChildren(String path, boolean watch, AsyncCallback.Children2Callback cb, Object ctx)
#异步方式返回子节点,不返回path指定节点的状态信息(stat)
4) void getChildren(String path, boolean watch, AsyncCallback.ChildrenCallback cb, Object ctx)
5) List<String> getChildren(String path, Watcher watcher)
6) List<String> getChildren(String path, Watcher watcher, Stat stat)
7) void getChildren(String path, Watcher watcher, AsyncCallback.Children2Callback cb, Object ctx)
8) void getChildren(String path, Watcher watcher, AsyncCallback.ChildrenCallback cb, Object ctx)
ZK geChildren API参数说明
path:数据节点路径
watcher:设置watcher后,如果path对应节点的数据发生变化,将会得到通知,允许为null
watch:是否使用默认的watcher
stat:指定数据节点的状态信息
cb:异步回调函数
ctx:上下文信息

5.获取节点数据

1) void getData(String path, boolean watch, AsyncCallback.DataCallback cb, Object ctx)
2) byte[] getData(String path, boolean watch, Stat stat)
3) void getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx)
4) byte[] getData(String path, Watcher watcher, Stat stat)
ZK getData API参数说明
path:数据节点路径
watcher:设置watcher后,如果path对应节点的数据发生变化,将会得到通知,允许为null
watch:是否使用默认的watcher
stat:指定数据节点的状态信息
cb:异步回调函数
ctx:上下文信息

6.修改节点数据

1) Stat setData(String path, byte[] data, int version)
2) void setData(String path, byte[] data, int version, AsyncCallback.StatCallback cb, Object ctx)
ZK setData API参数说明
path:被修改的节点路径
data:新的数据
version:版本,与上述功能一样
cb:异步回调函数
ctx:上下文信息

7.检测节点是否存在

1) Stat exists(String path, boolean watch)
2) void exists(String path, boolean watch, AsyncCallback.StatCallback cb, Object ctx)
3) Stat exists(String path, Watcher watcher)
4) void exists(String path, Watcher watcher, AsyncCallback.StatCallback cb, Object ctx)
ZK exists API参数说明
path:数据节点路径
watcher:注册的watcher,用于监听三个事件
节点被创建
节点被删除
节点被更新
watch:是否使用默认watcher
cb:异步回调函数
ctx:上下文信息

三、编码

public class ZookeeperTest {

    private static final String URL = "192.168.2.14:2181";

    private ZooKeeper zk;

    @Before
public void setUp() throws Exception {
zk = new ZooKeeper(URL, 20000, new Watcher() {
// 监控所有被触发的事件
@Override
public void process(WatchedEvent event) {
System.out.println("已经触发了" + event.getType() + "事件!");
}
}); } // 创建目录节点
@Test
public void createNode() throws Exception {
zk.create("/zkRoot", "10086".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} // 创建子节点
@Test
public void createChildNode() {
try {
zk.create("/zkRoot/zkChild", "1008611".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} // 显示节点列表
@Test
public void listNodes() throws Exception {
List<String> children = zk.getChildren("/", true);
System.out.println(children);
} // 获取节点
@Test
public void getNode() throws Exception {
System.out.println(new String(zk.getData("/zkRoot/zkChild", true, null)));
} // 修改节点信息
@Test
public void updateNode() throws Exception {
// version为-1则忽略版本检查
zk.setData("/zkRoot/zkChild", "1008612".getBytes(), -1);
} // 删除节点
@Test
public void deleteNode() {
// version为-1则忽略版本检查
try {
zk.delete("/zkRoot/zkChild", -1);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
} // 查看节点状态
@Test
public void showStatus() throws Exception {
Stat rt = zk.exists("/zkRoot/zkChild", true);
if (rt != null) {
System.out.println(rt);
} else {
System.out.println("节点不存在");
}
} @After
public void tearDown() throws Exception {
zk.close();
} }

四、Watch机制

1) 客户端向zk服务器注册watcher的同时,会将watcher对象存储在客户端的watchManger中。
2) zk服务器触发watcher事件后,会向客户端发送通知,客户端线程从watchManger中调用watcher执行。

重要说明:watch设置后,一旦触发一次立即会失效,如果需要一直监听,需要再次注册!!!

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

  1. Java API操作ZooKeeper

    创建会话 package org.zln.zk; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watch ...

  2. 六、Java API操作zookeeper节点

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

  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. 3.java内存模型以及happens-before规则

    1. JMM的介绍 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了.在多线程中稍微不注意就会出现线程安全 ...

  2. nyoj762——分解质因数+容斥+二分

    第k个互质数 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的 ...

  3. php上传多文件max_file_uploads限制问题

    在PHP程序中,常常会遇到这种问题,上传附件时明明成功上传了很多附件,如图片等,但实际上只存在20个附件,或者直接报错无法上传. 在DEDECMS5.7编辑图集的时候,发现只要超过20张图片保存就会出 ...

  4. lvs+keepalived+vsftp配置FTP服务器负载均衡

    LVS+Keepalive 实现服务器的负载均衡高可用一.安装两台机器的安装是一样的,这里只记录一遍.1. 下载LVS+Keepalive 所需安装包http://www.keepalived.org ...

  5. mysqldb 安装

    MySQLdb是python的一个标准的连接和操纵mysql的模块. ubuntu下安装: sudo apt-get install python-mysqldb sudo apt-get insta ...

  6. Neutron二层网络服务实现原理

    网络 ​ 网络(network)是一个隔离的二层网段,类似于物理网络世界中的虚拟 LAN (VLAN).更具体来讲,它是为创建它的租户而保留的一个广播域,或者被显式配置为共享网段.端口和子网始终被分配 ...

  7. 由浅入深了解EventBus:(一)

    概述 由greenrobot织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架; EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件.线程通信,可以 ...

  8. ZooKeeper和Dubbo

    前言 Dubbo是阿里开源的一个分布式服务框架,但是阿里内部用的却是HSF(High-speed Service Framework).下面看看怎么使用吧. Zookeeper Dubbo是个RPC调 ...

  9. rsync的配置文件模板及简单介绍,命令及参数

    必须知道推送有一个限速参数.--bwlimit=100 工作总必须要加.有三种模式,1.本地的模拟cp命令,在一个服务器2.远程的两个服务器之间,模拟scp3.以socket进程监听的方式启动rsyn ...

  10. CF445

    题解: xjb乱判断一下就可以了 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int n, ...