大牧关东 2014-06-18
在ubutun上用了一下ZK的java的api.感觉不错,挺好用的.当然首先要启动ZK服务器.
然后需要向Eclipse工程中导入三个包:
最后看看代码:
package com.wjy.zk; import java.io.IOException; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; /** * ZooKeeper Java Api 使用样例<br> * ZK Api Version: 3.4.3 * * @author 王吉元 */ public class JavaApiSample { private static final int CLIENT_PORT = 4180; private static final int CONNECTION_TIMEOUT = 5000; public static void main(String args[]) { // 创建一个与服务器的连接 ZooKeeper zk; try { zk = new ZooKeeper("localhost:" + CLIENT_PORT, CONNECTION_TIMEOUT, new Watcher() { // 监控所有被触发的事件 public void process(WatchedEvent event) { System.out.println("已经触发了" + event.getType() + "事件!"); } }); // 创建一个目录节点 zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 创建一个子目录节点 zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(new String(zk.getData("/testRootPath", false, null))); // 取出子目录节点列表 System.out.println(zk.getChildren("/testRootPath", true)); // 修改子目录节点数据 zk.setData("/testRootPath/testChildPathOne", "modifyChildDataOne".getBytes(), -1); // 若这里参数改为false,则删除testRootPath时不会触发NodeDeleted事件 System.out.println("目录节点状态:[" + zk.exists("/testRootPath", true) + "]"); // 创建另外一个子目录节点 zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 修改子节点数据不会出发NodeChildrenChanged事件 zk.setData("/testRootPath/testChildPathTwo", "I am node two".getBytes(), -1); System.out.println(new String(zk.getData( "/testRootPath/testChildPathTwo", true, null))); // 删除子目录节点 zk.delete("/testRootPath/testChildPathTwo", -1); zk.delete("/testRootPath/testChildPathOne", -1); // 删除父目录节点 zk.delete("/testRootPath", -1); // 关闭连接 zk.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeeperException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //运行结果: 已经触发了None事件! testRootData [testChildPathOne] 目录节点状态:[60,60,1403099080440,1403099080440,0,1,0,0,12,1,61 ] 已经触发了NodeChildrenChanged事件! I am node two 已经触发了NodeDeleted事件! 已经触发了NodeDeleted事件!
ZooKeeper支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取ZooKeeper服务的当前状态及相关信息。用户在客户端可以通过telnet或nc向ZooKeeper提交相应的命令