Zookeeper--Java API

韓家小志發表於2020-12-07

準備

  • windows上構建機器名稱與IP的對映
  • C:\Windows\System32\drivers\etc下的hosts檔案
192.168.100.203 node-01
192.168.100.204 node-02
192.168.100.205 node-03

建立節點

package bigdata.hanjiaxiaozhi.cn.zookeeper;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.Test;

/**
 * @ClassName ZkClientTest
 * @Description TODO 實現自定義開發Zookeeper的JavaAPI
 *  建立節點
 *  檢視資料
 *  修改資料
 *  設定監聽
 * @Date 2020/5/25 11:40
 * @Create By     hanjiaxiaozhi
 */
public class ZkClientTest {

    /**
     * 建立節點
     */
    @Test
    public void createZnode() throws Exception {
        //todo:1-構建連線
        //引數1:zookeeper的地址,可以寫一臺的地址,也可以寫多臺,用逗號隔開即可,也只連線一臺,如果一臺連線不上,會連線其他的
        //引數2:重試的機制
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,5);//第一個引數代表重試的間隔時間,第二個參數列示重試的次數
        //如果你們的Windows上沒有配置Linux機器名稱的對映,你們這裡寫IP地址
        //如何設定對映
        // Linux 上的對映:/etc/hosts
        // windows上的對映:C:\Windows\System32\drivers\etc\hosts
        CuratorFramework client = CuratorFrameworkFactory.newClient("node-01:2181,node-02:2181,node-03:2181", retryPolicy);
        //啟動客戶端連線
        client.start();
        //todo:2-實現操作
        //建立一個持久節點,creatingParentsIfNeeded:如果父節點不存在,先建立父節點
        //withMode:指定節點型別
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hanjiaxiaozhi","My name is Tom".getBytes());

        //todo:3-釋放連線
        client.close();
    }

}

獲取資料

  /**
     * 獲取節點的資料
     */
    @Test
    public void getZnodeData() throws Exception {
        //todo:1-構建連線
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,5);
        CuratorFramework client = CuratorFrameworkFactory.newClient("node-01:2181,node-02:2181,node-03:2181", retryPolicy);
        client.start();
        //todo:2-實現操作
        //獲取對應節點的資料
        byte[] datas = client.getData().forPath("/hanjiaxiaozhi");
        //列印在控制檯
        System.out.println(new String(datas));
        //todo:3-釋放連線
        client.close();
    }

修改資料

/**
     * 修改節點的值
     */
    @Test
    public void setZnodeData() throws Exception {
        //todo:1-構建連線
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,5);
        CuratorFramework client = CuratorFrameworkFactory.newClient("node-01:2181,node-02:2181,node-03:2181", retryPolicy);
        client.start();
        //todo:2-實現操作
        //修改節點的值
        client.setData().forPath("/hanjiaxiaozhi","My name is heima".getBytes());
        //todo:3-釋放連線
        client.close();
    }

設定監聽器

  /**
     * 實現監聽
     * @throws Exception
     */
    @Test
    public void setZnodeWatch() throws Exception {
        //todo:1-構建連線
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,5);
        CuratorFramework client = CuratorFrameworkFactory.newClient("node-01:2181,node-02:2181,node-03:2181", retryPolicy);
        client.start();
        //todo:2-實現操作
        //構建一個監聽器:JavaAPI中的監聽是迴圈持久的,不同於Linux命令列中的監聽是一次性的
        TreeCache treeCache = new TreeCache(client,"/hanjiaxiaozhi");
        //獲取觸發的監聽
        treeCache.getListenable().addListener(new TreeCacheListener() {
            //對每次觸發的監聽進行處理
            //第一個引數就是客戶端
            //第二個引數是觸發的監聽的事件
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                //先獲取監聽到的事件的資料
                ChildData data = event.getData();
                //判斷到底是哪一種操作觸發了監聽
                if(data != null){
                    switch (event.getType()){
                        case NODE_ADDED:
                            //列印詳細的資訊
                            System.out.println("NODE_ADDED:"+data.getPath()+"資料:"+ new String(data.getData()));
                            break;
                        case NODE_UPDATED:
                            System.out.println("NODE_UPDATED:"+data.getPath()+"資料:"+ new String(data.getData()));
                            break;
                        case NODE_REMOVED:
                            System.out.println("NODE_REMOVED:"+data.getPath()+"資料:"+ new String(data.getData()));
                            break;
                        default:
                            break;

                    }
                }else{
                    System.out.println("Data is null :"+event.getType());
                }
            }
        });
        //開啟監聽
        treeCache.start();
        Thread.sleep(10000000000000L);
        //關閉監聽
        treeCache.close();
        //todo:3-釋放連線
        client.close();
    }

相關文章