import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created with IntelliJ IDEA.
* Description: TODO(Java API -> 创建连接 -> 创建一个最基本的ZooKeeper对象实例)
* User: zhubo
* Date: 2018-01-09
* Time: 20:58
*/
public class ZooKeeper_Constructor_Usage_Simple implements Watcher{
/** 定义原子变量 */
AtomicInteger seq = new AtomicInteger();
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws Exception{
ZooKeeper zooKeeper = new ZooKeeper("centos4:2181",5000,new ZooKeeper_Constructor_Usage_Simple());
try{
countDownLatch.await();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("ZooKeeper session established.");
if(zooKeeper != null){
zooKeeper.close();
}
Thread.sleep(1000L);
}
@Override
public void process(WatchedEvent event) {
System.out.println("进入 process 。。。。。event = " + event);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (event == null) {
return;
}
// 连接状态
Event.KeeperState keeperState = event.getState();
// 事件类型
Event.EventType eventType = event.getType();
// 受影响的path
String path = event.getPath();
String logPrefix = "【Watcher-" + this.seq.incrementAndGet() + "】";
System.out.println(logPrefix + "收到Watcher通知");
System.out.println(logPrefix + "连接状态:\t" + keeperState.toString());
System.out.println(logPrefix + "事件类型:\t" + eventType.toString());
if (Event.KeeperState.SyncConnected == keeperState) {
// 成功连接上ZK服务器
if (Event.EventType.None == eventType) {
System.out.println(logPrefix + "成功连接上ZK服务器");
countDownLatch.countDown();
}
//创建节点
else if (Event.EventType.NodeCreated == eventType) {
System.out.println(logPrefix + "节点创建");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//this.exists(path, true);
}
//更新节点
else if (Event.EventType.NodeDataChanged == eventType) {
System.out.println(logPrefix + "节点数据更新");
System.out.println("我看看走不走这里........");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println(logPrefix + "数据内容: " + this.readData(PARENT_PATH, true));
}
//更新子节点
else if (Event.EventType.NodeChildrenChanged == eventType) {
System.out.println(logPrefix + "子节点变更");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println(logPrefix + "子节点列表:" + this.getChildren(PARENT_PATH, true));
}
//删除节点
else if (Event.EventType.NodeDeleted == eventType) {
System.out.println(logPrefix + "节点 " + path + " 被删除");
}
else{}
}
else if (Event.KeeperState.Disconnected == keeperState) {
System.out.println(logPrefix + "与ZK服务器断开连接");
}
else if (Event.KeeperState.AuthFailed == keeperState) {
System.out.println(logPrefix + "权限检查失败");
}
else if (Event.KeeperState.Expired == keeperState) {
System.out.println(logPrefix + "会话失效");
}
else {}
System.out.println("--------------------------------------------");
}
}
注意:
Zookeeper客户端和服务器端会话的建立是一个异步的过程,也就是说,在程序中构造方法会在处理完客户端初始化工作后立即返回,大多数情况下会话的生命周期处于CONNECTING状态,当该会话真正创建完毕后,Zookeeper服务端会向会话对应的客户端发送一个事件通知,已告知客户端,客户端之后在获取这个通知之后,才算真正建立了会话。
实现Watcher接口,重写process方法,该方法负责处理来自Zookeeper服务端的Watcher通知。
本文介绍如何使用 Java API 创建 ZooKeeper 连接并实现 Watcher 接口来监听 ZooKeeper 服务器的状态变化及节点事件。通过具体代码示例展示了连接建立过程和事件处理方法。

457

被折叠的 条评论
为什么被折叠?



