Zookeeper客户端java代码操作

上篇博客记录了shell命令操作zookeeper集群的方式,这次尝试采用java代码来操作。通过查阅API,发现并不困难。

1. 首先获得客户端与服务器的连接

    //zookeeper客户端
private ZooKeeper zkCli;
//连接地址
private static final String CONNECT_STRING = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
//session过期时间
private static final int SESSION_TIMEOUT = 2000; /**
* 创建客户端实例对象
*
* @throws IOException
*/
@Before
public void before() throws IOException {
zkCli = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, (event) -> {
System.out.println("默认的回调函数");
});
}

2. 列出根节点下的子节点(非递归)

    @Test
public void ls() throws KeeperException, InterruptedException {
List<String> children = zkCli.getChildren("/", e -> {
System.out.println("自定义回调函数");
}); System.out.println("---------------------");
for (String child : children) {
System.out.println(child);
}
System.out.println("+++++++++++++++++++++"); Thread.sleep(Long.MAX_VALUE); }

3. 在一个节点下创建子节点

    @Test
public void create() throws KeeperException, InterruptedException { //parameter1:创建的节点路径 parameter2:节点的数据 parameter3:节点权限 parameter4:节点类型
String str = zkCli.create("/idea", "idea2019".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(str);
Thread.sleep(Long.MAX_VALUE);
}

4. 获取指定节点的内容

    @Test
public void get() throws KeeperException, InterruptedException {
byte[] data = zkCli.getData("/simon", true, new Stat());
String str = new String(data);
System.out.println(str);
}

5. 给指定节点设置值

    @Test
public void set() throws KeeperException, InterruptedException {
Stat stat = zkCli.setData("/simon", "abcd".getBytes(), 1);
System.out.println(stat.getDataLength());
}

6. 获取指定节点的状态信息

    @Test
public void stat() throws KeeperException, InterruptedException { Stat exists = zkCli.exists("/ideaa", false);
if (exists == null) {
System.out.println("节点不存在");
} else {
System.out.println(exists.getDataLength());
}
}

7. 删除指定节点

    @Test
public void delete() throws KeeperException, InterruptedException {
Stat exists = zkCli.exists("/idea", false);
if (exists != null) {
zkCli.delete("/idea", exists.getVersion());
}
}

8. 循环注册,动态获取节点的信息。

也就是当节点有任何变化时,就会调用回调函数,动态的显示节点的变化信息。

    @Test
public void register() throws KeeperException, InterruptedException {
byte[] data = zkCli.getData("/simon2", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
try {
register();//发生事件,通知的时候在注册一遍,实现了循环调用
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, null);
System.out.println(new String(data));
} @Test
public void testRegister() {
try {
register(); //调用register()方法,将进程卡住,循环执行register
Thread.sleep(Long.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}
}

代码很简单易懂,只是有些内部原理还是有些模糊,例如:Stat是什么?zookeeper是怎么监听到节点发生变化的?又是如何将变化通知给客户端的?在之后的博客中将会详细记录。~

Zookeeper学习笔记(三)——java客户端代码操作的更多相关文章

  1. ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心

    作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...

  2. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

  3. Java学习笔记三:Java的变量、常量、变量的类型及使用规则

    Java的变量.常量.变量的类型及使用规则 每一种语言都有一些具有特殊用途的词,Java也不例外,它们被称为关键字.关键字对 Java 的编译器有着特殊的意义. 一:Java中的关键字: 注:Java ...

  4. MYSQL初级学习笔记三:数据的操作DML!(视频序号:初级_24,25,36)

    知识点五:数据的操作DML(24,25,36) 插入数据: --测试插入记录INSERT CREATE TABLE IF NOT EXISTS user13( id TINYINT UNSIGNED ...

  5. Java 学习笔记 (三) Java 日期类型

    以下内容摘自:  https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...

  6. SQL学习笔记三之MySQL表操作

    阅读目录 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 六 表完整性约束 七 修改表ALTER TABLE 八 复制表 九 删除表 一 存储引擎介绍 存储引擎即表类型,mys ...

  7. Hibernate学习笔记三:常用数据库操作语句

    转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...

  8. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  9. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

随机推荐

  1. pgsql 聚合函数array_to_string,ARRAY_AGG

    array_to_string--将sql中的数组转为字符串 ARRAY_AGG--将sql中的数据转为数组处理 以下给大家一个简单的例子即可体会: 1.需求     2.数据库中原数据   1.pn ...

  2. Unity 现代室内环境场景高效流程视频教程 附源文件 中文字幕

    大小1.83G,中文字幕 章节内容:1.项目介绍2.准备maya工程文件3.素材资产(assets)结构4.管理unity中的maya资产5.整合场景6.unity游戏对象及材质7.第一人称控制器8. ...

  3. golang 内存监控

    golang 内存监控 - 简书 https://www.jianshu.com/p/38dc129b6870

  4. Nginx配置SSL证书部署HTTPS网站(颁发证书)

    一.Http与Https的区别HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...

  5. vue---定义全局变量或函数

    开发项目的时候,有很多的东西需要重复使用,例如函数或者变量等,例如网站服务器地址,token等,这时候就需要设置一波全局变量和全局函数 定义全局函数 原理 新建一个模块文件,然后在main.js里面通 ...

  6. vue---数据列表过滤筛选

    使用vue进行数据过滤筛选是比较常用的功能,常见的使用场景就是搜索框数据筛选过滤了.简单示例: <template> <div> <input type="te ...

  7. Python使用偏函数与类实现装饰器

    # -*- coding: utf-8 -*- # author:baoshan # python对某个对象是否能通过装饰器形式使用只有一个要求:decorator必须是一个可被调用的对象. # 我们 ...

  8. BDD介绍

    TDD: TDD(Test-Drivern Development)测试驱动开发,是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代 ...

  9. 通过ip远程控制电脑

    现在,很多人都用了不止一台电脑,而同时操作两台电脑是一件比较麻烦的事情,所以,如果能够使用一台电脑的鼠标键盘显示器,去远程控制另一台电脑,那就方便多了. 远程计算机设置 1.先确保本地计算机和远程计算 ...

  10. LeetCode的一道题引申的python实现的对字符串进行分词,提取词频的方法

    在LeetCode上刷一道题,题目如下: 3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度. 示例?1: 输入: "abcabcbb"输出 ...