一、引入依赖

        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
</dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>

二、测试API

1、测试Zookeeper的获取数据的功能

      /**
* 测试Zookeeper的获取数据的功能
* @author 西门吹牛
* @throws Exception
* PS:在其中一台服务器断开的时候,这个用例是跑不过的
*/
@Test
public void getDataTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
Stat stat=new Stat();
byte[] bytes=zk.getData("/root",null,stat);
System.out.println("path:"+new String(bytes));
}

2、创建路径

      /**
* 创建路径
* @throws Exception
* PS:临时性节点不能有孩子
* acl:access control list访问控制列表
* PERSISTENT 持久化节点,不会被删除
* PERSISTENT_SEQUENTIAL 持久化节点,名称会追加一个单调递增的数字
* EPHEMERAL 临时节点,session丢失后会删除
* EPHEMERAL_SEQUENTIAL 临时节点,名称会追加一个单调递增的数字
*/
@Test
public void createPathTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
String strPath= zk.create("/root/sxl_node","sxl_node_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("path"+strPath);
}

3、删除路径
      /**
* 删除路径
* @throws Exception
*/
@Test
public void deletePathTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
//version等价于数据库的乐观锁
zk.delete("/root/sxl_node",0);
}

4、设置数据

          /**
* 设置数据
* @throws Exception
* 运行之前要去查一下数据版本,每次跑一次,数据版本会加1,这里写的是1
*/
@Test
public void setDataTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
Stat stat=zk.setData("/root","new_data".getBytes(),1);
System.out.println("stat_version:"+stat.getVersion());
}

5、获取孩子节点

          /**
* 获取孩子节点
* @throws Exception
*/
@Test
public void getChildren() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
List<String> nodeList=zk.getChildren("/",null);
for(String node:nodeList){
System.out.println("node:"+node);
}
}

三、注册观察者

我们注册观察者的目的是为了捕获集群的事件,当我们注册了观察者之后,集群发生事件就会发生回调。

1、回调函数是one time trigger(一次性触发)

      /**
* 观察者模式
* @throws Exception
*/
@Test
public void watcherTest() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
//注意:
// 1.这里只会输出hello,并不会打印"有事情发生"这句话
// 2.但是这不意味着回调函数没有起作用,而是回调函数(实际是在后台开一个线程)还没有机会打印的时候,程序已经运行完成了,可以跟watcherTest2单元测试比较来看
System.out.println("hello");
}
          /**
* 观察者模式2
* @throws Exception
*/
@Test
public void watcherTest2() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
Thread.sleep(5000);
System.out.println("hello");
}
          /**
* 观察者模式3
* @throws Exception
* 这里只会打印一次有事情发生,因为zookeeper的事情发生是一次性触发(one time trigger)
*/
@Test
public void watcherTest3() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
Stat stat=zk.setData("/root","root_new_data".getBytes(),2); while (true) {
Thread.sleep(5000);
}
}

2、通过回调函数来获取数据变化的事件

          /**
* 观察者模式4
* @throws Exception
* 这里我们在获取数据的时候加了一个watcher,这样在数据变化的时候会回调这个watcher,我们就知道数据改变了
*/
@Test
public void watcherTest4() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
byte[] data=zk.getData("/root",watcher,null);
System.out.println("data:"+new String(data));
Stat stat=zk.setData("/root","root_new_data".getBytes(),3); while (true) {
Thread.sleep(5000);
}
}

zookeepeer使用java api的更多相关文章

  1. Atitit 图像处理 调用opencv 通过java  api   attilax总结

    Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...

  2. 【分布式】Zookeeper使用--Java API

    一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...

  3. Elasticsearch的CRUD:REST与Java API

    CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...

  4. [转]HDFS中JAVA API的使用

    HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...

  5. HDFS中JAVA API的使用

    HDFS中JAVA API的使用   HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...

  6. java安全沙箱(四)之安全管理器及Java API

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  7. Java api 入门教程 之 JAVA的Random类

    在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...

  8. (转)Java API设计清单

    转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...

  9. 【hadoop2.6.0】利用Hadoop的 Java API

    Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...

随机推荐

  1. 转载------35岁开始转变的观念(干了这碗鸡汤再写代码保证没有bug)

    作为一个标准的IT男,从一开始的一线开发,做到管理层,又因为喜爱开发,跳槽继续专注coding,一干就是10多年.有时候就想,这样一直学习,coding,如果能干到老也挺不错的! 不过生活的压力是不会 ...

  2. ubuntu12.0.4开启root用户登陆

    1.命令:sudo passwd root 为root分配密码,按提示进行设置就好. 2.打开终端,输入以下命令: sudo -s 进入root账户下: cd /etc/lightdm       g ...

  3. MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)

    MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...

  4. 复杂的web---web中B/S网络架构

    web中B/S网络架构 1:web中B/S网络架构 2:CDN工作机制和架构 3:负载均衡:    B/S分别是浏览器/服务器,架构流程为:     当你访问网站的时候,浏览器发送各种请求给浏览器,服 ...

  5. ASP.NET Core 应用发布与部署指南

    一.前言 本篇主要包含哪些内容? 将项目发布到本地目录 将项目传输到服务器并配置启动&开机自动启动 将Nginx作为访问入口,配置反向代理 本篇环境信息 开发环境: 用途 工具&版本 ...

  6. SQL Server中sys.syslogin中updatedate字段的浅析

    在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过, ...

  7. LINQ的求和 平均 最大 最小 分组 计数 等等

    1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:使用Group By按Categ ...

  8. python连接sqlserver数据库

    1.准备工作 python3.6连接sqlserver数据库需要引入pymssql模块 pymssql官方:https://pypi.org/project/pymssql/ 没有安装的话需要: pi ...

  9. (转)Eclipse中快速输入System.out.println()的快捷键

    https://blog.csdn.net/ShiMengRan107/article/details/73614417 善用 Eclipse 组合键,可以提高输入效率. Step1: Eclipse ...

  10. Linux 小知识翻译 - 「LDAP」

    这次聊聊「LDAP」. LDAP是「Lightweight Directory Access Protocol」的所有,从名字上可以看出是协议的一种. LDAP是访问数据库(层次型数据库)的组件.管理 ...