基於 Java API 初探 zookeeper 的使用 一

1.如何連接zookeeper客戶端

package com.arcln.zookeeper;

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

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * 原生的 zookeeper API
 */
public class ConnectionDemo {
    public static void main(String[] args) throws Exception {
        final CountDownLatch downLatch = new CountDownLatch(1);
        final ZooKeeper zookeeper = new ZooKeeper("192.168.1.128:2181,192.168.1.129:2181,192.168.1.130:2181",
                4000,
                new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        if(event.getState() == Event.KeeperState.SyncConnected){
                            downLatch.countDown();
                        }
                    }
                });
        downLatch.await(); //爲了等待zooKeeper連接成功
        System.out.println("連接狀態--------->"+zookeeper.getState()+" <--------------");
        String nodeName = "/zk-persis-TEST";
        /** 創建節點
         * @param String path, 節點路徑
         * @param byte[] data, value值
         * @param List<ACL> acl, 開放權限
         * @param  CreateMode createMode,存儲模式
         */
        zookeeper.create(nodeName,"0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        //Stat中保存了zookeeper節點中對應的所有信息
        Stat stat = new Stat();
        //得到當前的節點
        byte[] bytes = zookeeper.getData(nodeName,null,stat);
        System.out.println("創建時的值:"+new String(bytes)+" ");

        //修改節點
        zookeeper.setData(nodeName,"1".getBytes(),stat.getVersion());

        //得到當前的節點
        byte[] bytes1 = zookeeper.getData(nodeName,null,stat);
        System.out.println("修改後的值:"+new String(bytes1)+" ");

        //刪除
        zookeeper.delete(nodeName,stat.getVersion());
        zookeeper.close();
       // System.in.read();
    }
}

2.事件機制

   Watcher監聽機制是Zookeeper中非常重要的特性,基於Zookeeper上創建的節點,可以對這些節點綁定監聽事體,比如監聽節點數據的變更,節點刪除,子節點狀態變更,通過這個事件機制,可以基於zookeeper實現分佈式鎖,集羣管理功能

   watcher特性:當數據發生變化的時候,zookeeper會產生一個watcher事件,並且會發送到客戶端,但是客戶端只會收到一次通知,如果後續這個節點再次發生變化,那麼之前設置watcher的客戶端面不會再次收到消息(可能通過循環監聽達到永久監聽的效果)。

   如何註冊事件機制

    通過這三個操作來綁定事件:getData、Exists、getChildren

    如何觸發事件?

    凡是事務類型的操作,都會觸發監聽事件。create /delete/setDatawatcher


package com.arcln.zookeeper;

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

import java.util.concurrent.CountDownLatch;

public class WatcherDemo {
    public static void main(String[] args) throws Exception {
        final CountDownLatch downLatch = new CountDownLatch(1);
        final ZooKeeper zookeeper = new ZooKeeper(
           "192.168.1.128:2181,192.168.1.129:2181,192.168.1.130:2181", 4000,
                new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        //全局默認事
                        if(event.getState() == Event.KeeperState.SyncConnected)
                            downLatch.countDown();
                    }
                });
        downLatch.await();
        String path = "/zk-persis-b";
        zookeeper.create(path,"x".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        //通過  exists  getData  getchildren 綁定事件
        //通過 exists綁定事件,watcher只會綁定一次事件
        Stat stat = zookeeper.exists(path, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println(watchedEvent.getType()+"->"+watchedEvent.getPath());
                try {
                    zookeeper.exists(watchedEvent.getPath(),true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        //通過修改值 ,來觸發事件
        stat = zookeeper.setData(path,"y".getBytes(),stat.getVersion());
        //通過刪除值 ,來觸發事件
        zookeeper.delete(path,stat.getVersion());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章