import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
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;
/**
*
* @author lvfang
*
*/
public class ZookeeperDemo {
//zookeeper地址
static final String CONNECT_ARRD = "192.168.1.201:2181";
//超时时间
static final int SESSION_OUTTIME = 5000;
//阻塞程序执行,用于等待zookeeper链接成功,发送信号
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
ZooKeeper zk = new ZooKeeper(CONNECT_ARRD, SESSION_OUTTIME, new Watcher(){
@Override
public void process(WatchedEvent event) {
//获取时间状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
//如果建立链接了
if(KeeperState.SyncConnected == keeperState){
if(EventType.None == eventType){
//如果建立链接成功,则发送信号,让后续阻塞程序向下执行
connectedSemaphore.countDown();
System.out.println("zk 建立链接成功!");
}
}
System.out.println("已经触发了" + event.getType() + "事件!");
}
});
//进行阻塞
connectedSemaphore.await();
/**
* 创建父节点(持久节点)
* 参数类型:
* 参数一:参数路径
* 参数二:节点内容,字节类型
* 参数三:节点权限,通用Ids.OPEN_ACL_UNSAFE
* 参数四:节点类型,{PERSISTENT:持久节点,
* PERSISTENT_SEQUENTIAL:持久顺序节点,
* EPHEMERAL:临时节点,
* EPHEMERAL_SEQUENTIAL:临时顺序节点}
*/
// String result = zk.create("/lvfangPath", "lvfangdata...".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//获取节点数据
// System.out.println(new String(zk.getData("/lvfangPath", false, null)));
/**
* 创建子节点(临时节点/持久节点)
* 注意:确保父节点已存在
*/
// String result = zk.create("/lvfangPath/ChildPathOne","ChildDataOne".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
// String result = zk.create("/lvfangPath/ChildPathOne","ChildDataOne".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
/**
* 取出子目录节点列表
*/
// List<String> none = zk.getChildren("/testRootPath", true);
// System.out.println(none);
/**
* 修改子目录节点数据
*/
// System.out.println(new String(zk.getData("/testRootPath/testChildPathOne", false, null)));
// zk.setData("/testRootPath/testChildPathOne", "this is a news".getBytes(),-1);
// System.out.println(new String(zk.getData("/testRootPath/testChildPathOne", false, null)));
/**
* 是否存在
* 不存在:null
* 存在:44970,44970,1487565866858,1487565866858,0,0,0,0,4,0,44970(节点信息)
*/
//System.out.println(zk.exists("/lvfang", false));;
/**
* 删除整个子目录 -1代表version版本号,-1是删除所有版本
*/
// zk.delete("/lvfangPath/ChildPathOne", -1);
// System.out.println(zk.getChildren("/lvfangPath", true));
/**
* AsyncCallback异步
*/
/*
zk.delete("/lvfangPath", -1, new AsyncCallback.VoidCallback() {
@Override
public void processResult(int rc, String path, Object ctx) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(rc);
System.out.println(path);
System.out.println(ctx);
}
}, "A");
System.out.println("继续执行... ...");
Thread.sleep(50000);
*/
//System.out.println(result);
zk.close();
/**
create(): 发起一个create操作. 可以组合其他方法 (比如mode 或background) 最后以forPath()方法结尾
delete(): 发起一个删除操作. 可以组合其他方法(version 或background) 最后以forPath()方法结尾
checkExists(): 发起一个检查ZNode 是否存在的操作. 可以组合其他方法(watch 或background) 最后以forPath()方法结尾
getData(): 发起一个获取ZNode数据的操作. 可以组合其他方法(watch, background 或get stat) 最后以forPath()方法结尾
setData(): 发起一个设置ZNode数据的操作. 可以组合其他方法(version 或background) 最后以forPath()方法结尾
getChildren(): 发起一个获取ZNode子节点的操作. 可以组合其他方法(watch, background 或get stat) 最后以forPath()方法结尾
inTransaction(): 发起一个ZooKeeper事务. 可以组合create, setData, check, 和/或delete 为一个操作, 然后commit() 提交
*/
}
}