zookeeper Java API 简单操作示例
本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信。
首先搭建maven环境,并在pom文件中加入zookeeper引用包:
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
如果从maven中引用失败,也不比灰心,在官网上下载zookeeper-3.4.9.tar.gz包,解压后里面包含zookeeper-3.4.9.jar包,在工程中引入这个包即可。
在工程中新建TestZookeeper.java文件,代码如下:
package com.unionpay.zookeeperDemo; import java.io.IOException; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; public class TestZookeeper {
public static void main(String[] args){
ZooKeeper zk = null; try{
System.out.println("......");
System.out.println("Starting to connencting zookeeper......"); String connectString = "127.0.0.1:2181";
int sessionTimeout = 2000; Watcher watcher = new Watcher(){ @Override
public void process(WatchedEvent event) {
if(event.getType() == null || "".equals(event.getType())){
return;
}
System.out.println("已经触发了" + event.getType() + "事件!");
}
};
zk = new ZooKeeper(connectString, sessionTimeout, watcher); /* zk = new ZooKeeper(connectString, sessionTimeout, new Watcher(){
public void process(WatchedEvent event){
if(event.getType()==null | "".equals(event.getType())){
return;
}
System.out.println("已经触发了" + event.getType() + "事件!");
}
});*/ System.out.println("Zookeeper Connected Successfully!"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("开始创建根目录节点/tmp_root_path...");
zk.exists("/tmp_root_path", true);
zk.create("/tmp_root_path", "我是根目录节点/tmp_root_path".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("根目录节点/tmp_root_path创建成功"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("开始创建第一个子目录节点/tmp_root_path/childPath1...");
zk.exists("/tmp_root_path/childPath1", true);
zk.create("/tmp_root_path/childPath1", "我是第一个子目录/tmp_root_path/childPath1".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("第一个子目录节点/tmp_root_path/childPath1创建成功"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("开始修改第一个子目录节点/tmp_root_path/childPaht1的数据......");
//通过getData 或 exists 方法触发watcher事件
zk.getData("/tmp_root_path/childPath1", true, null);
zk.setData("/tmp_root_path/childPath1", "我是修改后的第一个子目录/tmp_root_path/childPath1".getBytes("utf-8"), -1);
//version参数指定要更新的数据版本,如果version和真实的版本数据不同,则更新操作失败,当setData中设置版本为-1时,忽略版本检测
System.out.println("修改第一个子目录节点/tmp_root_path/childPath1数据成功!"); Thread.currentThread().sleep(10001); System.out.println("......"); System.out.println("获取根目录节点状态......");
System.out.println(zk.exists("/tmp_root_path", true));
System.out.println("根目录节点获取成功"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("开始创建第二个子目录节点/tmp_root_path/childPath2...");
zk.exists("/tmp_root_path/childPath2", true);
zk.create("/tmp_root_path/childPath2", "我是第二个子目录节点/tmp_root_path/childPath2".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("第二个子目录节点/tmp_root_path/childPath2创建成功"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("获取第二个子目录节点数据......");
System.out.println(new String(zk.getData("/tmp_root_path/childPath2", true, null)));
System.out.println("成功获取第二个子目录节点数据"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("开始获取根目录节点状态");
System.out.println(zk.exists("/tmp_root_path", true));
System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(10001); System.out.println("开始删除第一个子目录节点/tmp_root_path/childPath1...");
/*zk.getData("/tmp_root_path/childPath1", true, null);*/
zk.exists("/tmp_root_path/childPath1", true);
zk.delete("/tmp_root_path/childPath1", -1);
System.out.println("第一个子目录节点/tmp_root_path/childPath1删除成功"); Thread.currentThread().sleep(10001); System.out.println("开始获取根目录节点状态");
System.out.println(zk.exists("/tmp_root_path", true));
System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(10001); System.out.println("开始删除第二个子目录节点/tmp_root_path/childPath2......");
zk.delete("/tmp_root_path/childPath2", -1);
System.out.println("第二个子目录节点/tmp_root_path/childPath2删除成功"); Thread.currentThread().sleep(10001); System.out.println("......");
System.out.println("开始获取根目录节点状态");
System.out.println(zk.exists("/tmp_root_path", true));
System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(10001); System.out.println("开始删除根目录节点/tmp_root_path......");
zk.delete("/tmp_root_path", -1);
System.out.println("删除根目录节点/tmp_root_path成功"); Thread.currentThread().sleep(10001);
System.out.println("查看根目录节点状态");
System.out.println(zk.exists("/tmp_root_path", true));
System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(10001);
}catch(IOException | KeeperException | InterruptedException e){
e.printStackTrace();
}finally{
if(zk != null){
try{
zk.close();
System.out.println("关闭Zookeeper连接成功");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
然后启动zookeeper服务器:
bash server1/bin/zkServer.sh start bash server2/bin/zkServer.sh start bash server3/bin/zkServer.sh start
当zookeeper集群成功启动后,运行TestZookeeper.java文件,运行结果如下:
......
Starting to connencting zookeeper......
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Zookeeper Connected Successfully!
已经触发了None事件!
......
开始创建根目录节点/tmp_root_path...
已经触发了NodeCreated事件!
根目录节点/tmp_root_path创建成功
......
开始创建第一个子目录节点/tmp_root_path/childPath1...
已经触发了NodeCreated事件!
第一个子目录节点/tmp_root_path/childPath1创建成功
......
开始修改第一个子目录节点/tmp_root_path/childPaht1的数据......
已经触发了NodeDataChanged事件!
修改第一个子目录节点/tmp_root_path/childPath1数据成功!
......
获取根目录节点状态......
30064771083,30064771083,1487902036450,1487902036450,0,1,0,0,35,1,30064771084 根目录节点获取成功
......
开始创建第二个子目录节点/tmp_root_path/childPath2...
已经触发了NodeCreated事件!
第二个子目录节点/tmp_root_path/childPath2创建成功
......
获取第二个子目录节点数据......
我是第二个子目录节点/tmp_root_path/childPath2
成功获取第二个子目录节点数据
......
开始获取根目录节点状态
30064771083,30064771083,1487902036450,1487902036450,0,2,0,0,35,2,30064771086 根目录节点状态获取成功
开始删除第一个子目录节点/tmp_root_path/childPath1...
已经触发了NodeDeleted事件!
第一个子目录节点/tmp_root_path/childPath1删除成功
开始获取根目录节点状态
30064771083,30064771083,1487902036450,1487902036450,0,3,0,0,35,1,30064771087 根目录节点状态获取成功
开始删除第二个子目录节点/tmp_root_path/childPath2......
已经触发了NodeDeleted事件!
第二个子目录节点/tmp_root_path/childPath2删除成功
......
开始获取根目录节点状态
30064771083,30064771083,1487902036450,1487902036450,0,4,0,0,35,0,30064771088 根目录节点状态获取成功
开始删除根目录节点/tmp_root_path......
已经触发了NodeDeleted事件!
删除根目录节点/tmp_root_path成功
查看根目录节点状态
null
根目录节点状态获取成功
关闭Zookeeper连接成功
在代码中,我们可以看到zk.exists("****",true),不断出现,目的是为了监听相应的znode 修改和删除事件,从结果中我们也不难看出监听结果“已经触发了NodeDataChanged事件!”和“已经触发了NodeDeleted事件!”。之所以要对每个节点多次执行zk.exists(),这是因为在zookeeper机制下,zk.exists()方法、zk.get()方法和zk.getChildren()方法仅仅监控对应节点的一次变化(数据变化或者子节点数目发生变化)。
zookeeper可以监控到的事件类型:
- ZOO_CREATED_EVENT:节点创建事件,需要watch一个不存在的节点,当此节点被创建时,通过exist()设置可以触发该对该事件的监控;
- ZOO_DELETED_EVENT:节点删除事件,此watch通过exists()或者get()设置监控;
- ZOO_CHANGED_EVENT:节点数据改变事件,此watch通过exists()或者get()设置监控;
- ZOO_CHILD_EVENT:子节点列表改变事件,此watch通过getChildren()设置监控;
- ZOO_SESSION_EVENT:会话失效事件,客户端与服务端断开或者重新连结时触发;
- ZOO_NOWATCHING_EVENT:watch移除事件,服务端因为某些原因不再为客户端watch节点的触发
参考文献:
zookeeper Java API 简单操作示例的更多相关文章
- zookeeper JAVA API 简单操作
package org.admln.program.Zoo_Test; import java.io.IOException; import java.security.NoSuchAlgorithm ...
- 9. 使用ZooKeeper Java API编程
ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...
- Phoenix简介概述,Phoenix的Java API 相关操作优秀案例
Phoenix简介概述,Phoenix的Java API 相关操作优秀案例 一.Phoenix概述简介 二.Phoenix实例一:Java API操作 2.1 phoenix.properties 2 ...
- Zookeeper java api
Zookeeper java api 主要有以下几个: 方法名称 描述 String create(final String path, byte data[], List acl, CreateM ...
- 14.ZooKeeper Java API 使用样例
转自:http://www.aboutyun.com/thread-7332-1-1.html package com.taobao.taokeeper.research.sample; import ...
- github上创建java项目简单操作
github上创建java项目简单操作 参考L: github上创建java项目简单操作 - CSDN博客http://blog.csdn.net/qq_29392425/article/detail ...
- 【ZooKeeper】ZooKeeper安装及简单操作
ZooKeeper介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...
- HDFS Java API 常用操作
package com.luogankun.hadoop.hdfs.api; import java.io.BufferedInputStream; import java.io.File; impo ...
- zookeeper java api(使用java代码操作zookeeper)
1 导入相关的pom依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId&g ...
随机推荐
- easyui 动态加载语言包
解决办法是:把语言包中的语言类型写到cookie,动态修改cookie中的语言名称,修改完后重新渲染一下页面. 在页面加载完成后,先判断cookie存不存在,如果不存在就写入默认语言,存在就给easy ...
- express 创建node服务器
var express = require('express'); var app = new express(); app.listen(3000); app.get('/',function(re ...
- GCC手册学习(序)
已经是2014年的年末了,又快过了一年.今年,一定要认真把GCC再学习一遍,做好笔记. 总览 gcc [option|filename] ... g++ [option|filename] ... ...
- python-求直角三角形斜边
设计一个求直角三角形斜边长的函数(两条直角边为参数,求最长边) 如果直角边边长分分别为3和4,那么返回的结果应该像这样: The right triangle third side's length ...
- 以登录实例简单介绍Servlet使用
1.简单介绍 Java Servlet 是执行在 Web server或应用server上的程序,使用 Servlet.您能够收集来自网页表单的用户输入.呈现来自数据库或者其它源的记录.还能够动态创建 ...
- Lintcode---验证二叉查找树
给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 一个节点的 ...
- 远程调试 Weinre
什么是远程调试? 说白了,就是可以通过PC端[F12开发者工具]查看并调试移动端的页面内容,如html.css.js.Network资源等. 重要的事情说三遍:weinre所占有的端口不需要和监听页面 ...
- sql自动增长标识(转载)
sql自动增长标识 对于一个设了自动增长标识的数据表来说,它的字段的值是由数据库自动设置的:这在导数据时很麻烦. 当我们导数据时,我们往往想想将标识字段的数据也导进来,怎么办呢? 方法有两 ...
- 从A页面带参数跳转到B页面;进行解析,并显示数据,进行编辑
A页面跳转时候的地址: parent.layer.open({ type: 2, title:'新建草稿', shadeClose: true, shade: 0.8, scrollbar: fals ...
- iOS UITableViewHeaderFooterView设置背景色为透明
给UITableViewHeaderFooterView设置背景色分2种情况 1.tableView在group模式下,UITableViewHeaderFooterView的背景色默认是透明的,此时 ...