java 操作zookeeper(一)

首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 zkclient-0.1.jar即可。

zookeeper-3.3.4.jar 为官方提供的javaApi,zkClient-0.1jar为在源生api基础上进行扩展的开源JAVA客户端

创建会话方法:客户端可以通过创建一个zookeeper实例来链接zookeeper服务器。

Zookeeper(Arguments)方法(一共4个构造方法,根据参数不同)

参数说明如下:

connectString:连接服务器列表,已“,”分割。

sessionTimeOut:心跳检测时间周期(毫秒)

watcher:事件处理通知器。

canBereadOnly:标识当前会话是否支持只读。

sessionId和sessionPasswd:提供连接zookeeper的sessionId和密码,通过这两个确定唯一一台客户端,目的是可以提供重复会话

注意:zookeeper客户端和服务器端会话的建立是一个异步的过程,也就是说在程序中,我们程序方法在处理完客户端初始化后,立即返回(程序往下执行代码,这样,大多数情况下我们并没有真正构建好一个可用会话,在会话的声明周期处于"CONNECTING"时才算真正建立完毕,所以我们需要使用多线程中的一个工具类)

java 操作zookeeper(二)

创建节点(znode)方法,create

提供了两套创建节点的方法,同步和异步创建节点方式。

同步方式:

  参数1,节点路径(名称):/nodeName (不允许递归创建节点,也就是说在父节点不存在的情况下,不允许创建子节点)

  参数2,节点内容:要求类型是字节数组 (不支持序列化方式,如果需要实现序列化,可使用java相关的序列化框架,如Hession,Kryo框架)

  参数3,节点权限:使用Ids.OPEN_ACL_UNSAFE开发权限即可(一般在权限没有太高要求的场景下,没必要关注)

  参数4,节点类型 创建节点的类型:CreateMode.* 提供四种节点类型

    PERSISTENT (持久节点)

    PERSISTENT_SEQUENTIAL(持久顺序节点)

    EPHEMRAL(临时节点)

    EPHEMRAL_SEQUENTIAL(临时顺序节点)

java 操作zookeeper(三)  

    异步方式:(在同步基础上增加两个参数)

    参数5:注册一个异步回调函数,要实现AsynCallBack.StringCallBack接口。重写processResult(int rc,String path,Object ctx,String name) 方法,当节点创建完毕后,执行此方法。

      1.rc:为服务端响应码, 0表示调用成功,-4表示端口连接,-110表示指定节点存在,-112表示会话已经过期

      2.path:接口调用时传入API的数据节点的路径参数

      3.ctx:为调用接口传入API的ctx的值

      4.name:实际在服务器端创建节点的名称

    参数6传递给回调函数的参数,一般为上下文(Context)信息

  

java 操作zookeeper(四)

    删除节点:delete方法(api提供了两个接口,同步删除和异步删除方式)

    同步方式:

      参数1,节点名称 /deletePath

      参数2,版本号,即表示本次删除操作是针对该数据的某个版本进行操作。

    异步方式:

      参数3:一个异步回调函数

      参数4:用于传递上下文信息的对象。

    注意:在zookeeper中,只允许删除叶子节点信息,也就是说如果当前节点不是叶子节点则无法删除,或必须先删除其下所有的子节点,

java 操作zookeeper(五)

    getChildren读取数据方法:包括子节点列表获取和子节点数据的获取。

    参数1 path:获取指定节点下的数据(获取子节点列表)

    参数2 watcher: 注册的watcher ,一旦在本次子节点获取后,子节点列表发生变更的话,那么就会向客户端发送通知,该参数允许为null

    参数3 wath:表明是否需要注册一个watcher:如果为true,则会使用到zookeeper客户端上下文中提到的那个默认watcher,如果false,则表明不需要注册Watcher,

    参数4 cb: 回调函数

    参数5 ctx:上下文信息

    参数6 stat :指定数据节点的节点状态信息

  注意:当我们获取指定节点的子节点列表后,还需要订阅这个子节点列表的变化通知,这时候就可以通过注册一个watcher来实现,当子节点被添加或删除时,服务器端就会触发一个“NodeChildrenChanged”类型的时间通知,需要注意的是服务端发送给客户端的事件通知中,是不包含最新的节点列表的,客户端必须主动重新进行获取,通常在客户端收到这个事件通知后,就可以再次主动获取最新的子节点列表,也就是说,zookeeper服务端在想客户端发送watcher“NodeChildrenChanged”事件通知的时候,仅仅只发了一个通知,不会把节点的变化情况发给客户端,需要客户端自己重新获取,另外Watcher通知是一次性的,即触发后失效,因此客户端需要反复注册Watcher才行。

java 操作zookeeper(六)

    exists方法:检测节点是都存在

    参数1 path:路径

    参数2 watcher :注册的watcher对象。一旦之后节点内容有变更,则会向客户端发送通知,该参数允许为null (用于三类事件监听:节点的创建,删除,更新)

    参数3 watch :是否使用watcher,如果true 则使用默认上文中的watcher,false则不使用watcher

    参数4 cb:回调函数

    参数5 ctx:用于传递的下文信息对象

  注意:exists 方法意义在与无论节点是都存在,都可以进行注册watcher,能够对节点的创建,删除和修改进行监听,但是其子节点发生各种变化,都不会通知客户端。

 package bjsxt.zookeeper.base;

 import java.util.concurrent.CountDownLatch;

 import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper; /**
* Zookeeper base学习笔记
*/
public class ZookeeperBase { /** zookeeper地址 */
static final String CONNECT_ADDR = "192.168.2.2:2181";
/** session超时时间 */
static final int SESSION_OUTTIME = 2000;// ms
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME,
new Watcher() {
@Override
public void process(WatchedEvent event) {
// 获取事件的状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
// 如果是建立连接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == eventType) {
// 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
System.out.println("zk 建立连接");
connectedSemaphore.countDown();
}
}
}
}); // 进行阻塞
connectedSemaphore.await(); System.out.println("..");
// 创建父节点
// zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE,
// CreateMode.PERSISTENT); // 创建子节点
// zk.create("/testRoot/children", "children data".getBytes(),
// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 获取节点洗信息
// byte[] data = zk.getData("/testRoot", false, null);
// System.out.println(new String(data));
// System.out.println(zk.getChildren("/testRoot", false)); // 修改节点的值
// zk.setData("/testRoot", "modify data root".getBytes(), -1);
// byte[] data = zk.getData("/testRoot", false, null);
// System.out.println(new String(data)); // 判断节点是否存在
// System.out.println(zk.exists("/testRoot/children", false));
// 删除节点
// zk.delete("/testRoot/children", -1);
// System.out.println(zk.exists("/testRoot/children", false)); zk.close(); } }

java 操作zookeeper的更多相关文章

  1. Java操作zookeeper

    Java操作zookeeper总共有三种方式: 1.原生的Java API 2.zkclient 3.curator 第一种实现代码: pom.xml <dependency> <g ...

  2. zookeeper(三):java操作zookeeper

    引入jar包 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 ...

  3. Java 使用ZkClient操作Zookeeper

    目录 ZkClient介绍 导入jar包依赖 简单使用样例 ZkClient介绍 因为Zookeeper API比较复杂,使用并不方便,所以出现了ZkClient,ZkClient对Zookeeper ...

  4. Java代码操作zookeeper

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. Zookeeper--java操作zookeeper

    如果是使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 zkclien ...

  6. Zookeeper入门(七)之Java连接Zookeeper

    Java操作Zookeeper很简单,但是前提要把包导对. 关于Zookeeper的Linux环境搭建可以参考我的这篇博客:Linux环境下Zookeeper安装 下面进入正题: 一.导入依赖 < ...

  7. Java curator操作zookeeper获取kafka

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

  8. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  9. Java操作hbase总结

    用过以后,总得写个总结,不然,就忘喽. 一.寻找操作的jar包. java操作hbase,首先要考虑到使用hbase的jar包. 因为咱装的是CDH5,比较方便,使用SecureCRT工具,远程连接到 ...

随机推荐

  1. .net DLL 注册 regasm delphi调用

    .net DLL 注册 regasm regasm regasm myTest.dll regasm.exe 打开vs2005自带的工具“Visual Studio 2005命令提示”,输入上述命令 ...

  2. 爬虫介绍+Jupyter Notebook

    什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫    1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆 ...

  3. iOS 申请distribution证书, 公钥,私钥

    私钥只有在本机生成CSR文件的时候会产生,公钥会在CSR文件传给apple时,apple产生.

  4. 关于GC.Collect在不同机器上表现不一致问题

    2019.1.17,昨天项目更新后策划反应: 游戏卡,表现为:每走几步就卡一下.前天还没有. 但在我本机测试中,却没有任何卡顿感. QC同学的机器也卡.我去看了下,打开Profiler,没开deep, ...

  5. select min from 连接

    预先准备 create table p( name ) ); insert into p values('黄伟福'); insert into p values('赵洪'); insert into ...

  6. oc字符串与c字符串转换和拷贝

    // Helper method to create C string copy NSString* MakeNSString (const char* string) { if (string) { ...

  7. 【358】GitHub 上面文件夹下载方法

    参考:https://www.bilibili.com/read/cv210500/ 参考:https://www.jianshu.com/p/743ecc20ffb2 软件下载:Downloads ...

  8. adb push和adb install区别

    一般的,Android 应用程序有两种安装方法: 1. 将应用程序的apk文件push到手机中,用如下命令: adb push xxxx.apk /system/app. 2. 用adb instal ...

  9. nth-child与nth-of-type区别

    示例详细理解:nth-child(n)与:nth-of-type(n)区别 childselector:nth-child(index) 1,子选择器(childselector,这里是p选择器)选中 ...

  10. MySQL缓存分类和配置

    读书笔记,待补充完善 MySQL缓存分类 InnoDB缓冲池 InnoDB日志文件和MyIsAM数据的操作系统缓存 MyIsAM键缓存 查询缓存 无法手工配置的缓存,二进制日志,表定义文件的操作系统缓 ...