天天看點

zookeeper快速入門四:在java用戶端中操作zookeeper

先啟動zookeeper服務端。

zookeeper快速入門四:在java用戶端中操作zookeeper

在maven引入zookeeper依賴。

<dependency>
   <groupId>org.apache.hadoop</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.3.1</version>
</dependency>      

org.apache.zookeeper.Zookeeper是用戶端入口主類,負責建立與server的會話。它提供了以下 所示幾類主要方法。 

zookeeper快速入門四:在java用戶端中操作zookeeper

在java中啟動用戶端,注冊一個watcher監聽連結的建立。

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class ZookeeperClient {
    private static final String connectString = "127.0.0.1:2181";
    private static final int sessionTimeout = 2000;

    private static ZooKeeper zkClient = null;

    public void init() throws Exception {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                // 收到事件通知後的回調函數(應該是我們自己的事件處理邏輯)
                System.out.println("zookeeper連結建立");
            }
        });
    }
}
           

在main方法裡測試我們的init方法,用Thread.sleep方法等待zookeeper連接配接建立,不然在zookeeper用戶端建立連接配接之前主線程就已經退出。

public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(5000);
    }
           

控制台輸出:

zookeeper快速入門四:在java用戶端中操作zookeeper

接下來我們建立一個名為“/java”的節點,節點資料為“data”,ZooDefs.Ids.OPEN_ACL_UNSAFE的意思是不節點能被所有人通路,CreateMode.PERSISTENT:節點的類型為持久節點。

public void createZnode()throws Exception{
        zkClient.create("/java", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
           

判斷節點是否存在,false代表不注冊監聽事件,如果是true,則注冊我們在new zookeeper方法裡面傳遞的watcher。

public void testExist() throws Exception{
        Stat stat = zkClient.exists("/java", false);
        System.out.println(stat==null?"節點不存在":"節點存在");
    }
           

測試一下我們的方法。

public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(5000);
        new ZookeeperClient().createZnode();
        new ZookeeperClient().testExist();
    }
           
zookeeper快速入門四:在java用戶端中操作zookeeper

 擷取節點的資料。false和上面exists方法參數含義一樣,表示不注冊連接配接建立時的watcher,第三個stat對象則存儲了除了節點資料之外的其他資訊,如czxid、mzxid等。如果為null則表示不儲存節點的這些資訊。

public void getNodeData()throws Exception{
        byte[] res = zkClient.getData("/java",false,new Stat());
        System.out.println(new String(res));
    }
           

同樣測試我們的方法。

public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().getNodeData();
    }
           
zookeeper快速入門四:在java用戶端中操作zookeeper

 擷取ACL控制清單

public void getACl()throws Exception{
        List<ACL> res = zkClient.getACL("/java",new Stat());
        for(ACL acl : res){
            System.out.println(acl.getId().toString()+acl.getPerms());
        }
    }
           

測試:

public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().getACl();
    }
           
zookeeper快速入門四:在java用戶端中操作zookeeper

在/java下建立子節點,擷取子節點清單。

public void createChildZnode()throws Exception{
        zkClient.create("/java/child", "child data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zkClient.create("/java/child2", "child2 data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    public void getChildNode()throws Exception{
        List<String> res = zkClient.getChildren("/java",false);
        for(String s : res){
            System.out.println(s);
        }
    }
           

測試:

public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().createChildZnode();
        new ZookeeperClient().getChildNode();
    }
           
zookeeper快速入門四:在java用戶端中操作zookeeper

全部代碼如下:

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;

import java.util.List;

public class ZookeeperClient {
    private static final String connectString = "127.0.0.1:2181";
    private static final int sessionTimeout = 2000;

    private static ZooKeeper zkClient = null;

    public void init() throws Exception {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                // 收到事件通知後的回調函數(應該是我們自己的事件處理邏輯)
                System.out.println("zookeeper連結建立");
            }
        });
    }
    public void createZnode()throws Exception{
        zkClient.create("/java", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    public void createChildZnode()throws Exception{
        zkClient.create("/java/child", "child data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zkClient.create("/java/child2", "child2 data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    public void getChildNode()throws Exception{
        List<String> res = zkClient.getChildren("/java",false);
        for(String s : res){
            System.out.println(s);
        }
    }
    public void testExist() throws Exception{
        Stat stat = zkClient.exists("/java", false);
        System.out.println(stat==null?"節點不存在":"節點存在");
    }
    public void getNodeData()throws Exception{
        byte[] res = zkClient.getData("/java",false,new Stat());
        System.out.println(new String(res));
    }

    public void getACl()throws Exception{
        List<ACL> res = zkClient.getACL("/java",new Stat());
        for(ACL acl : res){
            System.out.println(acl.getId().toString()+acl.getPerms());
        }
    }
    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().createChildZnode();
        new ZookeeperClient().getChildNode();
    }

}