zoukankan      html  css  js  c++  java
  • ZooKeeper(3.4.5)

    一、创建会话

    1. 创建一个基本的ZooKeeper会话实例

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    
    /**
     * 创建一个基本的ZooKeeper会话实例
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            
            /**
             * ZooKeeper客户端和服务器会话的建立是一个异步的过程
             * 构造函数在处理完客户端的初始化工作后立即返回,在大多数情况下,并没有真正地建立好会话
             * 当会话真正创建完毕后,Zookeeper服务器会向客户端发送一个事件通知
             */
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        connectedSignal.countDown();
                    }
                }
            });
            System.out.println("State1: " + zk.getState());    // CONNECTING
            
            connectedSignal.await();        
            System.out.println("State2: " + zk.getState());    // CONNECTED
            
            zk.close();
            System.out.println("State3: " + zk.getState());    // CLOSED
        }
    
    }

    2. 创建一个复用sessionId和sessionPasswd的Zookeeper对象示例

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    
    /**
     * 创建一个复用sessionId和sessionPasswd的ZooKeeper对象示例
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);        
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        connectedSignal.countDown();
                    }
                }
            });
            
            connectedSignal.await();
            long sessionId = zk.getSessionId();
            byte[] passwd = zk.getSessionPasswd();
            zk.close();
                    
            final CountDownLatch anotherConnectedSignal = new CountDownLatch(1);
            ZooKeeper newZk = new ZooKeeper(
                    "192.168.1.109:2181", 
                    5000, 
                    new Watcher() {
                        @Override
                        public void process(WatchedEvent event) {
                            if (event.getState() == KeeperState.SyncConnected) {
                                anotherConnectedSignal.countDown();
                            }
                        }
                    },
                    sessionId, 
                    passwd);
            
            anotherConnectedSignal.await();
            newZk.close();
        }
    
    }

    二、创建节点

    1. 使用同步API创建一个ZNode节点

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    import org.apache.zookeeper.ZooDefs.Ids;
    
    /**
     * 使用同步API创建一个ZNode节点
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);       
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        connectedSignal.countDown();
                    }
                }
            });
            connectedSignal.await();
            
            String path = zk.create(
                    "/zk-huey", 
                    "hello".getBytes(), 
                    Ids.OPEN_ACL_UNSAFE, 
                    CreateMode.PERSISTENT
            );
            System.out.println(path + " is created.");
            
            zk.close();
        }
    
    }

    2. 使用异步API创建一个ZNode节点

    package com.huey.dream.demo;
    
    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.ZooKeeper;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    import org.apache.zookeeper.ZooDefs.Ids;
    
    /**
     * 使用异步API创建一个ZNode节点
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);       
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        connectedSignal.countDown();
                    }
                }
            });
            connectedSignal.await();
            
            zk.create(
                    "/zk-huey", 
                    "hello".getBytes(), 
                    Ids.OPEN_ACL_UNSAFE, 
                    CreateMode.PERSISTENT_SEQUENTIAL,
                    new AsyncCallback.StringCallback() {
                        @Override
                        public void processResult(int rc, String path, Object ctx, String name) {
                            // 服务器响应吗
                            System.out.println("ResultCode: " + rc);
                            // 接口调用时传入API的数据节点的路径参数值
                            System.out.println("Znode: " + path);
                            // 接口调用时传入API的ctx参数值
                            System.out.println("Context: " + (String)ctx);
                            // 实际在服务端创建的节点名
                            System.out.println("Real Path: " + name);
                        }
                    },
                    "The Context"
            );
            
            zk.close();
        }
    
    }

    三、删除节点

    1. 使用同API删除一个ZNode节点

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    
    /**
     * 使用同步API删除一个ZNode节点
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);       
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        connectedSignal.countDown();
                    }
                }
            });
            connectedSignal.await();
            
            zk.delete("/zk-huey", -1);
            
            zk.close();
        }
    
    }

    2. 使用异步API删除一个ZNode节点

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.AsyncCallback;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    
    /**
     * 使用异步API删除一个ZNode节点
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);       
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        connectedSignal.countDown();
                    }
                }
            });
            connectedSignal.await();
            
            zk.delete(
                    "/zk-huey", 
                    -1,
                    new AsyncCallback.VoidCallback() {
                        @Override
                        public void processResult(int rc, String path, Object ctx) {
                            System.out.println("ResultCode: " + rc);
                            System.out.println("Znode: " + path);
                            System.out.println("Context: " + (String)ctx);
                        }
                    },
                    "The Context"
            );
            
            zk.close();
        }
    
    }

    四、获取子节点列表

    1. 使用同步API获取子节点列表

    package com.huey.dream.demo;
    
    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.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;
    
    /**
     * 使用同步API获取子节点列表
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, null);
            zk.register(new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        } else if (event.getType() == EventType.NodeChildrenChanged) {                    
                            try {
                                System.out.println("NodeChildrenChanged.");
                                List<String> children = zk.getChildren(event.getPath(), true);
                                System.out.println("Children: " + children);
                            } catch (KeeperException e) {
                                e.printStackTrace();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.create("/zk-huey", "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            zk.create("/zk-huey/node1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            zk.create("/zk-huey/node2", "node2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            
            Stat stat = new Stat();
            List<String> children = zk.getChildren("/zk-huey", 
                    true,    // 注册默认的Watcher,当子节点类别发送变更的话,向客户端发送通知
                    stat    // 用于描述节点状态信息
            );
            System.out.println("Stat: " + stat);
            System.out.println("Children: " + children);
            
            zk.create("/zk-huey/node3", "node3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            
            Thread.sleep(10 * 1000);
            zk.close();
        }
    
    }

    结果输出:

    Stat: 4294967436,4294967436,1425201236879,1425201236879,0,2,0,0,4,2,4294967438
    
    Children: [node2, node1]
    NodeChildrenChanged.
    State: CONNECTED
    Children: [node2, node3, node1]

    2. 使用异步API获取子节点列表

    package com.huey.dream.demo;
    
    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;
    
    /**
     * 使用异步API获取子节点列表
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, null);
            zk.register(new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        } else if (event.getType() == EventType.NodeChildrenChanged) {                    
                            try {
                                System.out.println("NodeChildrenChanged.");
                                List<String> children = zk.getChildren(event.getPath(), true);
                                System.out.println("Children: " + children);
                            } catch (KeeperException e) {
                                e.printStackTrace();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.create("/zk-huey", "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            zk.create("/zk-huey/node1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            zk.create("/zk-huey/node2", "node2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            
            zk.getChildren("/zk-huey", 
                    true,
                    new AsyncCallback.Children2Callback() {
                        @Override
                        public void processResult(int rc, String path, Object ctx,
                                List<String> children, Stat stat) {
                            System.out.println("ResultCode: " + rc);
                            System.out.println("ZNode: " + path);
                            System.out.println("Context: " + ctx);
                            System.out.println("Children: " + children);
                            System.out.println("Stat: " + stat);
                        }
                    },
                    "The Context"
            );
            
            zk.create("/zk-huey/node3", "node3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            
            Thread.sleep(10 * 1000);
            zk.close();
        }
    
    }

    五、获取节点数据内容

    1. 使用同步API获取节点数据内容

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.CreateMode;
    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;
    
    /**
     * 使用同步API获取节点数据内容
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            byte[] nodeData = zk.getData("/zk-huey", false, null);
            System.out.println("NodeData: " + new String(nodeData));
            
            zk.close();
        }
    
    }

    2. 使用异步API获取节点数据内容

    package com.huey.dream.demo;
    
    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.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;
    
    /**
     * 使用异步API获取节点数据内容
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            zk.getData(
                    "/zk-huey", 
                    false, 
                    new AsyncCallback.DataCallback() {
                        @Override
                        public void processResult(int rc, String path, Object ctx, byte[] data,
                                Stat stat) {
                            System.out.println("ResultCode: " + rc);
                            System.out.println("ZNode: " + path);
                            System.out.println("Context: " + ctx);
                            System.out.println("NodeData: " + new String(data));
                            System.out.println("Stat: " + stat);
                        }
                    },
                    "The Context"
            );
            
            zk.close();
        }
    
    }

    六、更新数据

    1. 使用同步API更新节点数据内容

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.CreateMode;
    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;
    
    /**
     * 使用同步API更新节点数据内容
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            byte[] nodeData = zk.getData("/zk-huey", false, null);
            System.out.println("NodeData: " + nodeData);
            
            zk.setData("/zk-huey", "world".getBytes(), -1);
            nodeData = zk.getData("/zk-huey", false, null);
            System.out.println("NodeData: " + nodeData);
            
            zk.close();
        }
    
    }

    2. 使用异步API更新节点数据内容

    package com.huey.dream.demo;
    
    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.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;
    
    /**
     * 使用异步API更新节点数据内容
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            byte[] nodeData = zk.getData("/zk-huey", false, null);
            System.out.println("NodeData: " + nodeData);
            
            zk.setData(
                    "/zk-huey", 
                    "world".getBytes(), 
                    -1,
                    new AsyncCallback.StatCallback() {
                        @Override
                        public void processResult(int rc, String path, Object ctx, Stat stat) {
                            System.out.println("ResultCode: " + rc);
                            System.out.println("ZNode: " + path);
                            System.out.println("Context: " + ctx);
                            System.out.println("Stat: " + stat);
                        }
                    },
                    "The Context"
            );
            
            zk.close();
        }
    
    }

    七、判断节点是否存在

    1. 使用同步API判断节点是否存在

    package com.huey.dream.demo;
    
    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.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;
    
    /**
     * 使用同步API判断节点是否存在
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        }
                    }
                }
            });
            connectedSignal.await();
            
            Stat stat = zk.exists("/zk-huey", false);
            if (stat == null) {
                zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            } else {
                System.out.println("Stat: " + stat);
            }
            
            zk.close();
        }
    
    }

    2. 使用异步API判断节点是否存在

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.AsyncCallback;
    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.data.Stat;
    
    /**
     * 使用异步API判断节点是否存在
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == KeeperState.SyncConnected) {
                        if (event.getType() == EventType.None
                                && event.getPath() == null) {
                            connectedSignal.countDown();
                        }
                    }
                }
            });
            connectedSignal.await();
            
            zk.exists(
                    "/zk-huey", 
                    false,
                    new AsyncCallback.StatCallback() {
                        @Override
                        public void processResult(int rc, String path, Object ctx, Stat stat) {
                            System.out.println("ResultCode: " + rc);
                            System.out.println("ZNode: " + path);
                            System.out.println("Context: " + ctx);
                            System.out.println("Stat: " + stat);
                        }
                    },
                    "The Context"
            );
            
            zk.close();
        }
    
    }

    八、权限控制

    package com.huey.dream.demo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.ZooDefs.Ids;
    
    /**
     * ZooKeeper权限控制
     * @author  huey
     * @version 1.0 
     * @created 2015-3-1
     */
    public class ZKDemo {
        
        public static void main(String[] args) throws Exception {
            
            /**
             * 使用含有权限信息的zookeeper会话创建数据节点
             */
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    connectedSignal.countDown();
                }
            });
            connectedSignal.await();
            zk.addAuthInfo("digest", "huey:123".getBytes());
            zk.create("/zk-huey", "hello".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
            zk.close();
            
            /**
             * 使用无权限信息的zookeeper会话访问含有权限信息的数据节点
             */
            try {
                final CountDownLatch signal = new CountDownLatch(1);
                ZooKeeper zk1 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        signal.countDown();
                    }
                });
                signal.await();
                zk1.getData("/zk-huey", false, null);
                System.out.println("NodeData: " + new String(zk1.getData("/zk-huey", false, null)));
                zk1.close();
            } catch (Exception e) {
                System.out.println("Failed to delete Znode: " + e.getMessage());
            }
            
            /**
             * 使用错误权限信息的zookeeper会话访问含有权限信息的数据节点
             */
            try {
                final CountDownLatch signal = new CountDownLatch(1);
                ZooKeeper zk2 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        signal.countDown();
                    }
                });
                signal.await();
                zk2.addAuthInfo("digest", "huey:abc".getBytes());
                System.out.println("NodeData: " + new String(zk2.getData("/zk-huey", false, null)));
                zk2.close();
            } catch (Exception e) {
                System.out.println("Failed to delete Znode: " + e.getMessage());
            }
            
            /**
             * 使用正确权限信息的zookeeper会话访问含有权限信息的数据节点
             */
            try {
                final CountDownLatch signal = new CountDownLatch(1);
                ZooKeeper zk3 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        signal.countDown();
                    }
                });
                signal.await();
                zk3.addAuthInfo("digest", "huey:123".getBytes());
                System.out.println("NodeData: " + new String(zk3.getData("/zk-huey", false, null)));
                zk3.close();
            } catch (Exception e) {
                System.out.println("Failed to delete Znode: " + e.getMessage());
            }
        }
    
    }

    结果输出:

    Failed to delete Znode: KeeperErrorCode = NoAuth for /zk-huey
    Failed to delete Znode: KeeperErrorCode = NoAuth for /zk-huey
    NodeData: hello
  • 相关阅读:
    剑指offer--12.不用加减乘除做加法
    剑指offer--11.数组中出现次数超过一半的数字
    剑指offer--10.最小的K个数
    剑指offer--9.字符串的排列
    剑指offer--8.调整数组顺序使奇数位于偶数前面
    剑指offer-7.旋转数组的最小数字
    剑指offer--6.数值的整数次方
    剑指offer--5.变态跳台阶
    剑指offer--4.斐波那契数列
    剑指offer--3.用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/huey/p/4307056.html
Copyright © 2011-2022 走看看