public static void main(String[] args) {
/**zk是有session概念的,没有连接池的概念
* 第一类:new zk 时候,传入的watch,这个watch,session级别的,跟path 、node没有关系。
* 这里设置的3秒,是当客户端连接的zkServer挂了之后,3秒后集群中删除此session,
* session在集群其他机器上保留3秒,在3秒内客户端成功连接到某个机器后,取消删除session的行为
*/
final CountDownLatch cd = new CountDownLatch(1);
final ZooKeeper zk = new ZooKeeper("192.168.150.11:2181,192.168.150.12:2181,192.168.150.13:2181,192.168.150.14:2181",
3000, new Watcher() {
//Watch 的回调方法!
@Override
public void process(WatchedEvent event) {
Event.KeeperState state = event.getState();
Event.EventType type = event.getType();
String path = event.getPath();
System.out.println("new zk watch: "+ event.toString());
switch (state) {
case Unknown:
break;
case Disconnected:
break;
case NoSyncConnected:
break;
case SyncConnected:
System.out.println("connected");
cd.countDown();
break;
case AuthFailed:
break;
case ConnectedReadOnly:
break;
case SaslAuthenticated:
break;
case Expired:
break;
}
switch (type) {
case None:
break;
case NodeCreated:
break;
case NodeDeleted:
break;
case NodeDataChanged:
break;
case NodeChildrenChanged:
break;
}
}
});
cd.await();
ZooKeeper.States state = zk.getState();
switch (state) {
case CONNECTING:
System.out.println("ing......");
break;
case ASSOCIATING:
break;
case CONNECTED:
System.out.println("ed........");
break;
case CONNECTEDREADONLY:
break;
case CLOSED:
break;
case AUTH_FAILED:
break;
case NOT_CONNECTED:
break;
}
//创建一个path
String pathName = zk.create("/firstPath", "olddata".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
final Stat stat = new Stat();
/**
* path上的watch是一次性的
* 第二类:针对"/firstPath"此path上的watch,未来此path有变化时会回调process方法
*/
byte[] node = zk.getData("/firstPath", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("getData watch: "+event.toString());
try {
//true,default Watch 被重新注册,即上面new zk的那个watch
//false,只去数据,不观察未来是否有什么事件
//this,重新watch此节点自己
zk.getData("/firstPath",this ,stat);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, stat);
System.out.println(new String(node));
//触发回调
Stat stat1 = zk.setData("/firstPath", "newdata".getBytes(), 0);
//还会触发吗?当zk.getData("/firstPath",this ,stat)中间参数为this时,触发
Stat stat2 = zk.setData("/firstPath", "newdata01".getBytes(), stat1.getVersion());
System.out.println("-------async start----------");
/**
* 异步回调的方式,不在阻塞,真正取到数据的时候调processResult方法,data为取得的数据
*/
zk.getData("/firstPath", false, new AsyncCallback.DataCallback() {
@Override
public void processResult(int rc, java.lang.String path, Object ctx, byte[] data, Stat stat) {
System.out.println("-------async call back----------");
System.out.println(ctx.toString());
System.out.println(new String(data));
}
},"abc");
System.out.println("-------async over----------");
}