zk java 访问第一例:
利用java API访问zookeeper节点,并创建一个/controller的节点,数据为字符串"hellozk".
当主线程创建zk连接后,如果状态符合要求,才进行创建动作; 否则,等待watcher线程状态,等等等。。。等符合要求了再countDown,才创建zk目录。使用CountDownLatch可以实现这个功能。
package chap4;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* countdownlatch
* Created by niewj on 2016/12/19.
*/
public class ZkPathCreateTest {
/**
* 计数:当主线程创建zk连接后,如果状态符合要求,才进行创建动作;
* 否则,等待watcher线程状态,等等等。。。等符合要求了再countDown,才创建zk目录。
*/
CountDownLatch cdl = new CountDownLatch(1);
/**
* 连接zk,并创建一个目录节点。
* @throws IOException
* @throws KeeperException
* @throws InterruptedException
*/
private void init() throws IOException, KeeperException, InterruptedException {
// 1. watcher for zk
Watcher watcherZk = new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
System.out.println("状态::达到同步连接;输出path的状态: path ==> " + watchedEvent.getState());
cdl.countDown();
} else {
System.out.println("状态没有达到同步连接的状态,暂时不作为。。。。");
}
}
};
// 2. init zk args
ZooKeeper zk = new ZooKeeper("NIE-00:2181,NIE-01:2181,NIE-02:2181", 6000, watcherZk);
cdl.await();
// 3. create path /controller ephemeral
String stat = zk.create("/controller", "hellozk".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("created path is -->: " + stat);
}
public static void main(String[] args) {
try {
new ZkPathCreateTest().init();
} catch (IOException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
小结:
- ZooKeeper构造方法传递参数:zk_url, 超时毫秒数,状态监视器
- zk.create(path, data, acl列表, 创建的数据类型)
- CountDownLatch,倒数计数线程并发工具。如果主线程有需要等待的地方,先设置await(), 在别的线程任务准备妥当可以突破await处往下走的时候在等待线程那里countDown(),countDown的次数,使得等待的剩余0个的时候,主线程就可以继续接下来的动作了。这里的话,就是,zk连接需要等待确认状态,才可以创建节点,所以,确认状态准备好之后,就在watcher里countDown,然后主线程检测到1-1=0,就可以突破await,执行下面的create动作了。
燃烧吧,passion