一、引入依赖

        <!-- 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. Java用户自定义函数

    用户除了可以使用JavaScript的内置函数之外,还可以自己定义函数.自定义函数有3种方法. 使用关键字 function 构造 语法: function funcName([param1][,pa ...

  2. Sysbench Sysbench在centos系统下的安装

    Sysbench在centos系统下的安装   by:授客 QQ:1033553122       测试环境: CentOS-7-x86_64-DVD-1503-01.iso 下载地址: http:/ ...

  3. Ubuntu添加新分区

    1.查看分区 ~$ sudo fdisk -l 2.添加分区 ~$ fdisk /dev/sda 3.输入m查看帮助 ~$ m 4.输入n新建分区,即添加分区 ~$ n 这里会出现设置分区大小 5.输 ...

  4. PyCharm 使用Github管理Django项目

    不管是对于教程代码免费分享的需要,还是项目开发过程中的版本管理,Github都是我们首选的开源代码仓库,如果你没有私有仓库,并且不用保护代码,那么将项目上传到Github上是最佳的选择. 关于如何使用 ...

  5. Django 配置文件settings注解(含静态文件和上传文件配置)

    基于Django1.11配置文件settings.py import os import sys # Build paths inside the project like this: os.path ...

  6. python使用sax实现xml解析

    之前在使用xml解析的时候,在网上搜了很多教程,最终没有能按照网上的教程实现需求. 所以呢,只好自己去看源码,在sax的__init__.py下看到这么一段代码: 1 def parse(source ...

  7. win7文件搜索技巧

    重要说明   (1)搜索的字符串是大小写不敏感的 (2)字符串带双引号与不带双引号是有区别的 如:hello,搜索包含hello单词开头的文件或目录,名为“aa_HELLOcc...”.“cc-Hel ...

  8. PHP断言(ASSERT)的用法

    简述 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.程序员断言在程序中的某个特定点该的表达式值为真.如果该表达式为假,就中断操作. 可以 ...

  9. Mysql----修改MySQL5.7的root的密码

    在开始服务的情况之下 进入mysql  更改密码:update mysql.user set authentication_string=password('新的密码') where  user='r ...

  10. js 实现动态时间

    <span id="timebox"></span>                   //承载时间的span $(function () { var o ...