ZooKeeper_Java操作(创建节点/获取节点/删除节点)
来源:互联网 发布:mac切换中文输入法 编辑:程序博客网 时间:2024/06/04 18:26
关于ZooKeeper的介绍,网上很多介绍,我也懒的在多写了..
直接上代码吧.. 长时间不用,会生疏..
关于环境, 我自己在虚拟机上装了CentOs6.8服务器,然后在上面装了ZooKeeper,单机模式吧
用不到集群模式
Java操作ZooKeeper
创建单个节点
package com.java.module.zookeeper.zk_1;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooDefs;import org.apache.zookeeper.ZooKeeper;import java.util.concurrent.CountDownLatch;/** * */public class CreateZNode implements Watcher { //超时时间 private static final int SESSION_TIMEOUT = 5000; private ZooKeeper zk; private CountDownLatch connectedSignal = new CountDownLatch(1); /** * 连接zookeeper * * @param host * @throws Exception */ public void connect(String host) throws Exception { zk = new ZooKeeper(host, SESSION_TIMEOUT, this); connectedSignal.await(); } /** * 关闭zk连接 * * @throws Exception */ public void closeZk() throws Exception { zk.close(); } @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { connectedSignal.countDown(); } } /** * 创建zk节点 * * @param zNode * @throws Exception */ public void createZNode(String zNode) throws Exception { String path = "/" + zNode; String createPath = zk.create(path, null/*data*/, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(createPath); } public static void main(String[] args) { try { CreateZNode create = new CreateZNode(); create.connect("192.168.125.125:2181"); create.createZNode("testZNode"); create.closeZk(); } catch (Exception e) { e.printStackTrace(); } }}
在connect方法中,实例化了一个ZooKeeper类的对象,这个类是客户端中API中的主要类,用于维护客户端和ZooKeeper服务之间得连接.
ZooKeeper类的构造函数主要有三个参数 :
1. ZooKeeper服务的主机地址
2. 以毫秒为单位的会话超时时间.
3. Watcher对象的实例.Watcher对象接收来自于ZooKeeper的回调,以获得各种事件的通知.
当一个ZooKeeper的实例被创建时,会启动一个线程连接到ZooKeeper服务.
由于构造函数的调用是立即返回的,因此在使用新建的ZooKeeper对象之前一定要等待其与ZooKeeper服务之间成功建立连接.
我们使用Java的CountDownLatch类来阻止使用新建的ZooKeeper对象,直到这个ZooKeeper对象已经准备就绪.
Watcher累被用于获取ZooKeeper对象是否准备就绪的信息,在它的接口中只有一个方法 :
public void process(WatchedEvent watchedEvent)
当客户端已经与ZooKeeper服务建立连接后,Watcher的process()方法会被调用,参数是一个用于表示该链接的事件.
在接收到一个连接事件(以Watcher.Event.KeeperState的枚举型值SyncConnected来表示)时,我们通过调用CountDownLatch的countDown()方法来递减它的计数器.
在调用countDown()方法之后,计数器的值变为0,则await()方法返回.
现在connect()方法已返回,然后执行创建节点的方法.所需的参数 :
1. 路径(字符串表示)
2. znode的内容(字节数组)
3. 访问控制列表
4. 节点类型(暂时/持久)
a) 暂时(临时) : 当创建znode的客户端断开连接时,临时节点都会被删除.
b) 持久(永久) : 当创建znode的客户端断开连接时,永久节点不会被删除.
多节点创建
注意 : 创建多级zNode节点,必须是父node已经创建的前提下,否则会报错.
也就是说,一下子无法创建多级node节点.
Demo代码 创建的子节点是临时节点,在客户端断开连接时(程序休眠结束)可以去服务器上验证下.
import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;import java.util.concurrent.CountDownLatch;/** * Created by CYX on 2017/3/14. */public class ConnectionWatcher implements Watcher {//超时时间private static final int SESSION_TIMEOUT = 5000;protected ZooKeeper zk;private CountDownLatch connectedSignal = new CountDownLatch(1);/** * 连接zookeeper * * @param host * @throws Exception */public void connect(String host) throws Exception {zk = new ZooKeeper(host, SESSION_TIMEOUT, this);connectedSignal.await();}/** * 关闭zk连接 * * @throws Exception */public void closeZk() throws Exception {zk.close();}@Overridepublic void process(WatchedEvent watchedEvent) {if (watchedEvent.getState() == Watcher.Event.KeeperState.SyncConnected) {connectedSignal.countDown();}}}import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.ZooDefs;/** * Created by CYX on 2017/3/14. */public class JoinGroup extends ConnectionWatcher {@Overridepublic void connect(String host) throws Exception {super.connect(host);}@Overridepublic void closeZk() throws Exception {super.closeZk();}@Overridepublic void process(WatchedEvent watchedEvent) {super.process(watchedEvent);}public void join(String groupName , String memberName)throws Exception {String path = "/" + groupName + "/" + memberName;String createPath = zk.create(path, null/*data*/, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);System.out.println(createPath);}public static void main(String[] args) throws Exception{JoinGroup joinGroup = new JoinGroup();joinGroup.connect("192.168.125.125:2181");joinGroup.join("testZNode", "twoPath");Thread.sleep(30000);}}注意 :ConnectionWatcher这个类后面的例子中是公有的,写Demo的时候注意.
客户端还连接着,子节点是存在的.
客户端断开连接之后,子节点消失
获取父节点下的子节点
package com.java.module.zookeeper.zk_3;import com.java.module.zookeeper.util.ConnectionWatcher;import org.apache.zookeeper.WatchedEvent;import java.util.List;/** * 获取节点下的子节点 */public class ListGroup extends ConnectionWatcher {@Overridepublic void connect(String host) throws Exception {super.connect(host);}@Overridepublic void closeZk() throws Exception {super.closeZk();}@Overridepublic void process(WatchedEvent watchedEvent) {super.process(watchedEvent);}public void listGroup(String groupName) throws Exception {String path = "/" + groupName;List<String> nodes = zk.getChildren(path, false);if (nodes.isEmpty())System.out.println("节点 : " + path + " 下没有子节点 ");for (String node : nodes) {System.out.println(node);}}public static void main(String[] args) throws Exception{ListGroup listGroup = new ListGroup();listGroup.connect("192.168.125.125:2181");listGroup.listGroup("testZNode");}}
删除节点
注意 : zk不支持递归删除节点,所以必须先将子节点删除才能删除父节点.
package com.java.module.zookeeper.zk_4;import com.java.module.zookeeper.util.ConnectionWatcher;import org.apache.zookeeper.WatchedEvent;import java.util.List;/** * 删除zk上的节点. * zk不支持递归删除节点,所以必须先将子节点删除才能删除父节点. */public class DeleteGroup extends ConnectionWatcher {@Overridepublic void connect(String host) throws Exception {super.connect(host);}@Overridepublic void closeZk() throws Exception {super.closeZk();}@Overridepublic void process(WatchedEvent watchedEvent) {super.process(watchedEvent);}public void delete(String groupName) throws Exception {String path = "/" + groupName;try {List<String> nodes = zk.getChildren(path, false);for (String node : nodes) {zk.delete(path + "/" + node, -1);}zk.delete(path, -1);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {DeleteGroup deleteGroup = new DeleteGroup();deleteGroup.connect("192.168.125.125:2181");deleteGroup.delete("testZNode");}}
好了,今天到此为止,其与的后面有时间再搞..
- ZooKeeper_Java操作(创建节点/获取节点/删除节点)
- DOM操作-获取节点-创建节点
- javascript中dom节点操作(创建节点、增加节点、删除节点、克隆节点)
- Zookeeper客户端基本操作java实现——创建连接、创建节点、添加修改节点内容、获取子节点、获取节点数据、删除节点
- js创建及操作节点之删除节点、替换节点、插入节点
- tinyxml使用:创建XML,遍历打印xml文件 select操作,获取单个节点值,删除节点操作,修改节点操作,增加节点操作
- 11.21课堂笔记-查找节点和创建节点、插入节点和删除节点、复制节点替换节点、包裹节点和属性操作、样式操作、设置和获取HTML、文本和值
- jstree 创建删除节点,获取选择的节点数据
- Zookeeper命令行操作(常用命令;客户端连接;查看znode路径;创建节点;获取znode数据,查看节点内容,设置节点内容,删除节点;监听znode事件;telnet连接zookeeper)
- jquery节点的操作 创建 删除 复制
- 节点创建删除替换
- jQuery创建,删除节点
- javascript创建删除节点
- 创建删除节点
- JqueryDOM操作-删除节点
- 16 删除节点 17创建节点
- 单链表创建,删除节点,添加节点,排序
- JqueryDOM操作-创建节点
- Problem B: 时间类的错误数据处理
- 究极java工程师第一步基本服务搭建(二),redhat6.4配置yum源
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
- Vitalik Buterin:以太坊Casper惩罚条件的最小化
- Linux学习笔记|一道题搞清楚目录与文件权限设置
- ZooKeeper_Java操作(创建节点/获取节点/删除节点)
- 在Linux里安装、启动nginx
- Problem C: 时间类的常量
- JVM调优方法(转)
- 设计模式学习--组合模式
- 分布式基础理论
- 构建嵌入式Linux + web+sqlite +php5.0 平台
- NJCTF-easy_crypto writeup
- 人人都可以做深度学习应用:入门篇