使用JAVA API調用ZooKeeper

一、環境準備及創建會話實例
  1. JAR包
        使用JAVA API調用ZooKeeper時必須要導入對應的jar包
        對應的jar包:ZooKeeper-3.x.x.jar(其中的x需要依據版本而定。注意:使用3.4.14版本的ZooKeeper時,如何使用3.4.14的jar包,創建連接時需要把session超時時間設置長一點否則會報錯,改用3.4.10版本的jar包則無此問題
        在lib目錄下的jar包也是需要導入的
 
       2. 創建會話實例
        需要訪問ZooKeeper的第一步是需要先保證可以創建會話實例
        創建會話實例的方法
            ZooKeeper(String connectString,int sessionTimeout,Watcher watcher)
                connectString:表示連接到哪一個Zookeeper,如192.168.2.2:2181
                sessionTimeout:表示會話過期時間,單位是毫秒
                watcher:通過註冊Watcher來實現對節點的狀態變化監聽
 
        關於ZooKeeper的構造方法還有如下幾個:
            ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,boolean canBeReadOnly)
            ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,boolean canBeReadOnly)
            ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd,boolean canBeReadOnly)
                canBeReadOnly:表示當前會話是否支持read-only
                sessionId:表示會話的ID
                sessionPasswd:密鑰
 
        關於watcher
            watcher是org.apache.Zookeeper.Watcher類型的對象,當客戶端和服務器建立連接後會調用Watcher中的process方法,這個方法中會有一個WatchedEvent類型的參數,它用來標識發生了哪一種事件
            WatchedEvent主要包含以下兩個方面的信息:
                watchedEvent.getState():取得與服務器連接狀態,這裏的連接狀態包含(SyncConnected、Disconnected、connectedReadOnly、AuthFailed等)
                watchedEvent.getType():取得節點事件類型,通過它可以獲得具體的事件類型,這裏事件類型的取值包含(None、NodeCreated、NodeDeleted、            NodeDataChanged、NodeChildrenChanged)
            注意:Watcher通知是一次性的,當一旦觸發一次通知後,這個Watcher就無效了,客戶端需要再次註冊Watcher,否則無法再次監聽到節點的狀態變化
 
二、使用JAVA API調用ZooKeeper
 
使用JAVA API創建節點
public class ZooKeeperDemo implements Watcher{
    private static final int SESSION_TIMEOUT = 3000;
    public static ZooKeeper ZooKeeper;
    public static void main(String[] args) {
        String path = "/mynode";
        try {
            ZooKeeper = new ZooKeeper("192.168.2.2:2181",SESSION_TIMEOUT,new ZooKeeperDemo());
            ZooKeeper.exists(path,true);
            ZooKeeper.create(path,"mycontent 1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }




    @Override
    public void process(WatchedEvent event) {
        if(Event.KeeperState.SyncConnected == event.getState()){
            if(Event.EventType.NodeCreated == event.getType()){
                //創建成功時在此處進行回調
                System.out.println("node創建成功!");
                try {
                    ZooKeeper.exists(event.getPath(),true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

 
創建節點語句:
ZooKeeper.create(path,"mycontent 1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    第一個參數:path,是一個局部變量“/mynode”
    第二個參數:"mycontent 1".getBytes(),指的是創建節點的數據值
    第三個參數:ZooDefs.Ids.OPEN_ACL_UNSAFE,指的是這個節點的訪問權限爲任何人可以訪問
    第四個參數:CreateMode.PERSISTENT,指的是創建節點的類型,這裏指的是在會話重啓後節點仍然存在
 
節點的創建、取值、修改、刪除操作
public class ZookeeperDemo01 implements Watcher {
    //定義sessioTimeout常量
    private static final int SESSION_TIMEOUT = 30000;
    public static ZooKeeper zooKeeper;


    public static void main(String[] args) {
        createNode("/zknode1");
        getContent("/zknode1");
        setContent("/zknode1","你好!");
        getContent("/zknode1");
        deleteNode("/zknode1");
        closeConnect(zooKeeper);
    }




    @Override
    public void process(WatchedEvent watchedEvent) {
        if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
            if (Event.EventType.NodeCreated == watchedEvent.getType()) {
                //創建節點的消息通知
                System.out.println("創建節點成功! 時間:" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date()));
                try {
                    zooKeeper.exists(watchedEvent.getPath(), true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else if(Event.EventType.NodeDeleted == watchedEvent.getType()){
                try {
                    zooKeeper.exists(watchedEvent.getPath(),true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("節點被刪除! 時間:" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date()));
            } else if(Event.EventType.NodeDataChanged == watchedEvent.getType()){
                try {
                    zooKeeper.exists(watchedEvent.getPath(),true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("節點被修改! 時間:" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date()));
            }
        }
    }


    /**
     * 創建節點
     *
     * @param path
     */
    public static void createNode(String path) {
        try {
            zooKeeper = new ZooKeeper("192.168.2.4:2181", SESSION_TIMEOUT, new ZookeeperDemo01());
            zooKeeper.exists(path, true);
            //創建節點
            zooKeeper.create(path, "xiesheng".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 獲取節點的內容
     *
     * @param path
     * @return
     */
    public static String getContent(String path) {
        try {
            if (zooKeeper == null) {
                zooKeeper = new ZooKeeper("192.168.2.4:2181", SESSION_TIMEOUT, new ZookeeperDemo01());
            }
            byte[] rb = zooKeeper.getData(path, null, null);
            System.out.println("獲取節點【" + path + "】的內容爲:" + new String(rb));
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 設置節點的內容
     * @param path
     * @param content
     */
    public static void setContent(String path,String content) {
        try {
            if (zooKeeper == null) {
                zooKeeper = new ZooKeeper("192.168.2.4:2181", SESSION_TIMEOUT, new ZookeeperDemo01());
            }
            zooKeeper.setData(path, content.getBytes(), -1);
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 刪除節點
     * @param path
     */
    public static void deleteNode(String path){
        try {
            if (zooKeeper == null) {
                zooKeeper = new ZooKeeper("192.168.2.4:2181", SESSION_TIMEOUT, new ZookeeperDemo01());
            }
            zooKeeper.delete(path,-1);
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 關閉連接
     * @param zooKeeper
     */
    public static void closeConnect(ZooKeeper zooKeeper){
        if(zooKeeper == null){
            System.out.println("未連接,無需關閉!");
        } else {
            try {
                zooKeeper.close();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("連接關閉成功!");
        }
    }
}

 

進行以上測試後控制檯打印結果如下:
    創建節點成功! 時間:2020-13-04 11:13:11
    獲取節點【/zknode1】的內容爲:xiesheng
    節點被修改! 時間:2020-13-04 11:13:17
    獲取節點【/zknode1】的內容爲:你好!
    節點被刪除! 時間:2020-13-04 11:13:23
    連接關閉成功!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章