准备:
要么使用maven,要么手动引入zookeeper-3.4.6.jar和zk包lib文件夹下的jar包,slf4j-api-1.6.1.jar等
示例代码:
同步接口:
package raw_client; import java.io.IOException; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; 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; import org.apache.zookeeper.data.Stat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SyncApi implements Watcher { private static CountDownLatch connectedSemaphore = new CountDownLatch(1); private static Stat stat = new Stat(); private static final Logger log = LoggerFactory.getLogger(SyncApi.class); static ZooKeeper zk = null; static String path = "/zk_test"; public static void main(String[] args) throws IOException, InterruptedException, KeeperException { // ----------------------连接--------------------------- // 直接连连不上 state: Expired long sessionID = 1111111; String sessionPWD = "s1_pwd"; SyncApi sa = new SyncApi(); zk = new ZooKeeper("127.0.0.1:2181", 5000, sa, sessionID, sessionPWD.getBytes()); log.info("ZooKeeper state: " + zk.getState()); ZooKeeper zk1 = new ZooKeeper("127.0.0.1:2181", 5000, sa); long sessionId = zk1.getSessionId(); byte[] passwd = zk1.getSessionPasswd(); connectedSemaphore.await(); log.info("ZooKeeper session established."); // 错误的session state: Expired zk = new ZooKeeper("127.0.0.1:2181", 5000, sa, 1l, "test".getBytes()); // 正确的session state: SyncConnected zk = new ZooKeeper("127.0.0.1:2181", 5000, sa, sessionId, passwd); zk.exists(path, true); //----------------------------创建节点------------------------ String pPath = zk.create(path, "fad".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 下面这行报NodeExistsException // zk.create(path, "fad".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); String esPath = zk.create(path, "fad".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); String psPath = zk.create(path, "fad".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); /* java进程结束后,临时节点消失 [zk: localhost:2181(CONNECTED) 29] ls / [zk_test0000000011, zookeeper, zk_test0000000010, zk_test] [zk: localhost:2181(CONNECTED) 30] ls / [zk_test0000000011, zookeeper, zk_test]*/ //----------------------------删除节点------------------------ zk.delete(psPath, -1); zk.delete(esPath, 0); // 下面这行报BadVersion // zk.delete(pPath, 10); //----------------------------获取数据------------------------ log.info(new String(zk.getData(path, sa, stat))); log.info("Signature: " + stat.signature() + " Ctime: " + stat.getCtime() + " Aversion: " + stat.getAversion() + " Cversion: " + stat.getCversion() + " Czxid: " + stat.getCzxid() + " DataLength: " + stat.getDataLength() + " Mtime: " + stat.getMtime() + " Mzxid: " + stat.getMzxid() + " NumChildren: " + stat.getNumChildren() + " Version: " + stat.getVersion() + " Pzxid: " + stat.getPzxid()); //----------------------------更新数据------------------------ // 测试watcher,下面这行触发NodeDataChanged类型的事件 zk.setData(path, "update123".getBytes(), 0); //----------------------------获取子节点------------------------ List<String> childrenList = zk.getChildren(path, sa, stat); log.info(childrenList.toString()); zk.create(path + "/c1", "c11111111".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); Thread.sleep(2000); // 清理数据 // 如果有子节点,直接删除会报错:Directory not empty for /zk_test // 先删除子节点 zk.delete(path + "/c1", -1); zk.delete(path, -1); Thread.sleep(2000); zk.close(); //----------------------------AuthInfo------------------------ String childPath = path + "/c1"; connectedSemaphore = new CountDownLatch(1); zk = new ZooKeeper("127.0.0.1:2181", 5000, sa); zk.addAuthInfo("digest", "key:value1".getBytes()); connectedSemaphore.await(); // 这里ACL和上面不同,否则加了AuthInfo也没有效果 zk.create(path, "f".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); Thread.sleep(1000); zk.create(childPath, "c".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); Thread.sleep(1000); // 认证失败不可以删除子节点 try { connectedSemaphore = new CountDownLatch(1); ZooKeeper zk2 = new ZooKeeper("127.0.0.1:2181", 5000, sa); connectedSemaphore.await(); // NoAuth for /zk_test/c1 zk2.delete(childPath, -1); } catch (Exception e) { log.info("delete node " + path + "c1" + " fail: " + e.getMessage()); } // 认证成功可以删除子节点 connectedSemaphore = new CountDownLatch(1); ZooKeeper zk3 = new ZooKeeper("127.0.0.1:2181", 5000, sa); connectedSemaphore.await(); zk3.addAuthInfo("digest", "key:value1".getBytes()); zk3.delete(childPath, -1); log.info("deleted node " + childPath); // 节点本身无法限制权限 connectedSemaphore = new CountDownLatch(1); ZooKeeper zk4 = new ZooKeeper("127.0.0.1:2181", 5000, sa); connectedSemaphore.await(); zk4.delete(path, -1); log.info("deleted node " + path); Thread.sleep(Integer.MAX_VALUE); } @Override public void process(WatchedEvent event) { log.info("----------------"); log.info("event: {}", event); log.info("path: {}", event.getPath()); log.info("state: {}", event.getState()); log.info("type: {}", event.getType()); log.info("----------------"); try { if (KeeperState.SyncConnected == event.getState()) { if (event.getType() == EventType.None && null == event.getPath()) { connectedSemaphore.countDown(); } else if (event.getType() == EventType.NodeDataChanged) { log.info(new String(zk.getData(event.getPath(), true, stat))); log.info(stat.getCzxid() + "," + stat.getMzxid() + "," + stat.getVersion()); } else if (event.getType() == EventType.NodeChildrenChanged) { List<String> childrenList = zk.getChildren(path, false); log.info("changed child: " + childrenList.toString()); } else if (EventType.NodeCreated == event.getType()) { log.info("Node(" + event.getPath() + ")Created"); zk.exists(event.getPath(), true); } else if (EventType.NodeDeleted == event.getType()) { log.info("Node(" + event.getPath() + ")Deleted"); zk.exists(event.getPath(), true); } } } catch (Exception e) { log.error(e.toString()); } } }
异步接口:
package raw_client; import java.io.IOException; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AsyncApi implements Watcher { private static CountDownLatch connectedSemaphore = new CountDownLatch(1); private static Stat stat = new Stat(); static ZooKeeper zk = null; private static final Logger log = LoggerFactory.getLogger(AsyncApi.class); public static void main(String[] args) throws IOException, InterruptedException, KeeperException { zk = new ZooKeeper("127.0.0.1:2181", 5000, new AsyncApi()); connectedSemaphore.await(); //----------------------------创建节点------------------------ String path = "/zk_test"; zk.create(path, "main".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new MyStringCallback(), "contex"); //----------------------------获取数据------------------------ zk.getData(path, true, new MYDataCallback(), null); //----------------------------更新数据------------------------ zk.setData(path, "childdata".getBytes(), 0); //----------------------------获取子节点------------------------ zk.create(path + "/c1", "child".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new MyStringCallback(), "contex"); zk.getChildren(path, true, new MyChildren2Callback(), "ctx"); zk.getChildren(path, true, new MyChildrenCallback(), "ctx"); //----------------------------删除节点------------------------ Thread.sleep(2000); zk.delete(path + "/c1", -1); zk.delete(path, -1, new MyVoidCallback(), "ctx"); Thread.sleep(Integer.MAX_VALUE); } @Override public void process(WatchedEvent event) { log.info("event: {}", event); log.info("path: {}", event.getPath()); log.info("state: {}", event.getState()); log.info("type: {}", event.getType()); if (KeeperState.SyncConnected == event.getState()) { if (event.getType() == EventType.None && null == event.getPath()) { connectedSemaphore.countDown(); } else if (event.getType() == EventType.NodeDataChanged) { try { log.info(new String(zk.getData(event.getPath(), true, stat))); log.info(stat.getCzxid() + "," + stat.getMzxid() + "," + stat.getVersion()); } catch (Exception e) { } } } } } class MyStringCallback implements AsyncCallback.StringCallback { private static final Logger log = LoggerFactory.getLogger(MyStringCallback.class); @Override public void processResult(int rc, String path, Object ctx, String name) { log.info("Create path result: [" + rc + ", " + path + ", " + ctx + ", real path name: " + name); } } class MyVoidCallback implements AsyncCallback.VoidCallback { private static final Logger log = LoggerFactory.getLogger(MyVoidCallback.class); @Override public void processResult(int rc, String path, Object ctx) { log.info("delete path result: " + rc + ", " + path + ", " + ctx); } } class MYDataCallback implements AsyncCallback.DataCallback { private static final Logger log = LoggerFactory.getLogger(MYDataCallback.class); @Override public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) { log.info(rc + ", " + path + ", " + new String(data)); log.info(stat.getCzxid() + "," + stat.getMzxid() + "," + stat.getVersion()); } } class MyChildren2Callback implements AsyncCallback.Children2Callback { private static final Logger log = LoggerFactory.getLogger(MyChildren2Callback.class); @Override public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) { log.info("Get Children znode result: [response code: " + rc + ", param path: " + path + ", ctx: " + ctx + ", children list: " + children + ", stat: " + stat); } } class MyChildrenCallback implements AsyncCallback.ChildrenCallback { private static final Logger log = LoggerFactory.getLogger(MyChildrenCallback.class); @Override public void processResult(int rc, String path, Object ctx, List<String> children) { log.info("Get Children znode result: [response code: " + rc + ", param path: " + path + ", ctx: " + ctx + ", children list: " + children); } }