1. ZooKeeper的JavaClient是我们更轻松的去对ZooKeeper进行各种操作。我们仅需要引入zookeeper-3.7.0.jar和zookeeper-jute-3.7.0.jar两个jar包即可。
2. 创建会话
2.1. 客户端可以创建一个ZooKeeper实例来连接ZooKeeper服务器。
2.2. ZooKeeper构造函数的connectString参数, 连接服务器列表, 使用,分割多个服务器地址。
2.3. ZooKeeper构造函数的sessionTimeout参数, 心跳检测时间周期, 以毫秒为单位。
2.4. ZooKeeper构造函数的watcher参数, 事件处理通知器。
2.5. ZooKeeper客户端和服务器会话的创建是一个异步的过程, 也就是说在程序中, ZooKeeper实例创建完成后立即返回, 但是大多数情况下我们并没有真正构建好一个可用会话, 在会话的生命周期处于CONNECTING时才算真正建立完毕。
3. 创建节点
3.1. ZooKeeper提供了两套创建节点的方法, 同步和异步创建节点方式。
3.2. 创建节点path参数, 节点路径, 不允许递归创建节点。
3.3. 创建节点data参数, 节点内容, 字节数组类型。
3.4. 创建节点acl参数, 节点权限, 最简单的值Ids.OPEN_ACL_UNSAFE开放权限。
3.5. 创建节点createMode参数, 创建节点类型。CreateMode.PERSISTENT持久节点; CreateMode.PERSISTENT_SEQUENTIAL持久顺序节点; CreateMode.EPHEMERAL临时节点; CreateMode.EPHEMERAL_SEQUENTIAL临时顺序节点。
3.6. 创建节点Create2Callback参数, 注册一个异步回调函数。rc: 服务器相应码, 0表示创建成功, -4表示端口未连接, -110表示指定节点存在, -112表示会话过期。path: 接口调用时传入API的数据节点的路径参数。xtx: 为接口传入API的上下文参数值。name: 实际在服务器端创建节点的名称。stat: 节点属性信息。
3.7. 创建节点ctx参数, 为接口调用传入上下文参数。
4. 创建节点例子
4.1. 新建一个名为zookeeper的Java项目, 同时拷入相关jar包
4.2. 创建Create.java
package com.zk.rm;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.AsyncCallback.Create2Callback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class Create {
private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";
private static final CountDownLatch cdl = new CountDownLatch(1);
public static void main(String[] args) {
try {
// 创建连接
ZooKeeper zk = new ZooKeeper(connectString, 5000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if(KeeperState.SyncConnected == event.getState()) {
// 刚刚连接成功, 没有事件
if(EventType.None == event.getType()) {
// 如果建立连接成功, 发送信号量, 让后续阻塞程序能够继续向下执行
cdl.countDown();
System.out.println("建立连接成功了。");
}
}
}
});
// 进行阻塞
cdl.await();
// 创建父节点
String ret = zk.create("/myRoot", "创建了一个我的根节点。".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(System.currentTimeMillis() + " " + ret);
// 异步创建子节点
zk.create("/myRoot/child1", "根节点上创建了一个child1的子节点".getBytes(), Ids.OPEN_ACL_UNSAFE