(原) 2.3 Curator使用

来源:http://www.cnblogs.com/shengkejava/archive/2016/07/15/5663259.html
-Advertisement-
Play Games

本文為原創文章,轉載請註明出處,謝謝 Curator使用 1、jar包引入,演示版本為2.6.0,非maven項目,可以下載jar包導入到項目中 2、RetryPolicy:重試機制 ExponentialBackoffRetry:每次重試會增加重試時間baseSleepTimeMs Exponen ...


本文為原創文章,轉載請註明出處,謝謝

Curator使用

1、jar包引入,演示版本為2.6.0,非maven項目,可以下載jar包導入到項目中

 

       <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.6.0</version>
        </dependency> 

 

2、RetryPolicy:重試機制

  • ExponentialBackoffRetry:每次重試會增加重試時間baseSleepTimeMs
    • ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries)
    • ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries, int maxSleepMs)
      • baseSleepTimeMs:基本重試時間差
      • maxRetries:最大重試次數
      • maxSleepMs:最大重試時間
  • RetryNTimes
    • RetryNTimes(int n, int sleepMsBetweenRetries)
      • n:重試次數
      • sleepMsBetweenRetries:每次重試間隔時間
  • RetryUntilElapsed
    • RetryUntilElapsed(int maxElapsedTimeMs, int sleepMsBetweenRetries)
      • maxElapsedTimeMs:最大重試時間
      • sleepMsBetweenRetries:每次重試間隔時間
  • BoundedExponentialBackoffRetry、RetryOneTime、SleepingRetry

3、創建Zookeeper連接

  • 傳統方式

   示例:CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.117.128:2181",5000,5000,retryPolicy);

   API:  

newClient(java.lang.String connectString, org.apache.curator.RetryPolicy retryPolicy)

newClient(java.lang.String connectString, int sessionTimeoutMs, int connectionTimeoutMs, org.apache.curator.RetryPolicy retryPolicy)
    • connectString:Zookeeper伺服器地址
    • retryPolicy:自定義重試機制
    • sessionTimeoutMs:session超時時間
    • connectionTimeoutMs:連接超時時間
  • 鏈式方式 
curatorFramework = CuratorFrameworkFactory.builder()
                                .connectString("192.168.117.128:2181")
                                //.authorization() 設置訪問許可權 設置方法同原生API
                                .sessionTimeoutMs(5000).connectionTimeoutMs(5000)
                                .retryPolicy(retryPolicy).build();
  • 代碼示例
    public void createSession() {
        //RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);//基本重試間隔時間,重試次數(每次重試時間加長)
        //RetryPolicy retryPolicy = new RetryNTimes(5,1000);//重試次數,重試間隔時間
        RetryPolicy retryPolicy = new RetryUntilElapsed(5000,1000);//重試時間,重試間隔時間
        //curatorFramework = CuratorFrameworkFactory.newClient("192.168.117.128:2181",5000,5000,retryPolicy);
        curatorFramework = CuratorFrameworkFactory.builder()
                                .connectString("192.168.117.128:2181")
                                //.authorization() 設置訪問許可權 設置方法同原生API
                                .sessionTimeoutMs(5000).connectionTimeoutMs(5000)
                                .retryPolicy(retryPolicy).build();
        curatorFramework.start();
    }

 

4、創建節點

public void createNode() throws Exception {
        createSession();
        String path = curatorFramework.create()
                .creatingParentsIfNeeded()//如果父節點沒有自動創建
                //.withACL()設置許可權  許可權創建同原生API
                .withMode(CreateMode.PERSISTENT)//節點類型
                .forPath("/note_curator/02", "02".getBytes());
        System.out.println("path:"+path);
    }

節點類型、許可權設置詳見2.1Zookeeper原生API使用

 

5、節點刪除

  public void del() throws Exception {
        createSession();
        curatorFramework.delete()
                .guaranteed()//保證機制,出錯後後臺刪除 直到刪除成功
                .deletingChildrenIfNeeded()//刪除當前節點下的所有節點,再刪除自身
                .forPath("/note_curator");
    }

 

6、獲取子節點

public void getChildren() throws Exception {
        createSession();
        List<String> children = curatorFramework.getChildren().forPath("/note_curator");
        System.out.println(children);

    }

 

7、獲取節點信息

public void getData() throws Exception {
        createSession();
        Stat stat = new Stat();
        byte[] u = curatorFramework.getData().storingStatIn(stat).forPath("/note_curator");
        System.out.println(new String(u));
        System.out.println(stat);
    }

 

8、設置節點信息

public void setData() throws Exception {
        createSession();
        curatorFramework.setData()
                //.withVersion(1) 設置版本號 樂觀鎖概念
                .forPath("/note_curator/01", "shengke0815".getBytes());
    }

 

9、是否存在節點

public void exists() throws Exception {
        createSession();
        Stat s = curatorFramework.checkExists().forPath("/note_curator");
        System.out.println(s);
    }

 

10、設置節點信息回調

 ExecutorService executorService = Executors.newFixedThreadPool(5);//線程池
    @Test
    public void setDataAsync() throws Exception {
        createSession();
        curatorFramework.setData().inBackground(new BackgroundCallback() {//設置節點信息時回調方法
            @Override
            public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {

                System.out.println(curatorFramework.getZookeeperClient());
                System.out.println(curatorEvent.getResultCode());
                System.out.println(curatorEvent.getPath());
                System.out.println(curatorEvent.getContext());
            }
        },"shangxiawen",executorService).forPath("/note_curator","sksujer0815".getBytes());
        Thread.sleep(Integer.MAX_VALUE);
    }

API:

inBackground(org.apache.curator.framework.api.BackgroundCallback backgroundCallback, java.lang.Object o, java.util.concurrent.Executor executor);
    • backgroundCallback:自定義BackgroundCallback
    •   o:上下文信息,回調方法中curatorEvent.getContext()可獲取此信息
    •   executor:線程池

 

11、監聽節點改變事件

public void nodeListen() throws Exception {
        createSession();
        final NodeCache cache = new NodeCache(curatorFramework,"/note_curator");
        cache.start();
        cache.getListenable().addListener(new NodeCacheListener() {
            @Override
            public void nodeChanged() throws Exception {
                System.out.println(new String(cache.getCurrentData().getData()));
                System.out.println(cache.getCurrentData().getPath());
            }
        });

        Thread.sleep(Integer.MAX_VALUE);

    }

 

12、監聽子節點列表改變事件

public void nodeClildrenListen() throws Exception {
        createSession();
        final PathChildrenCache cache = new PathChildrenCache(curatorFramework,"/note_curator",true);
        cache.start();
        cache.getListenable().addListener(new PathChildrenCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
                switch (pathChildrenCacheEvent.getType()){
                    case CHILD_ADDED:
                        System.out.println("add children");
                        System.out.println(new String(pathChildrenCacheEvent.getData().getData()));
                        System.out.println(new String(pathChildrenCacheEvent.getData().getPath()));
                        break;
                    case CHILD_REMOVED:
                        System.out.println("remove children");
                        System.out.println(new String(pathChildrenCacheEvent.getData().getData()));
                        System.out.println(new String(pathChildrenCacheEvent.getData().getPath()));
                        break;
                    case CHILD_UPDATED:
                        System.out.println("update children");
                        System.out.println(new String(pathChildrenCacheEvent.getData().getData()));
                        System.out.println(new String(pathChildrenCacheEvent.getData().getPath()));
                        break;
                }
            }
        });

        Thread.sleep(Integer.MAX_VALUE);

    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /*String類用於描述字元串事物的那麼它就提供了多個方法對字元串進行操作方法都會用,字元串這塊就結束了常見的操作有哪些?“abcd”它應該具備什麼功能,我們才能更好得操作它?1.獲取(必須要掌握) 1.1 字元串中包含的字元數,也就是字元串的長度 int length() 然而數組也有長度,數組 ...
  • 看到成員變數和局部變數同名這個知識點的時候一開始有點懵逼,想了一下其實特別簡單。 先來看一個簡單的代碼。 首先我定義了一個Person類。 然後在主函數裡面創建對象並輸出。 輸出結果是什麼?並不是我們想象的我的年齡是20,而是下麵這樣: 想一下其實就很容易理解。 一句話,如果不同名,那麼方法內的變數 ...
  • 快速排序: 1、從數組中隨便選出一個數(其實一般用第一個數)作為本次迴圈的比較基數,然後走一趟,把所有比基數小的數放在該基數的左邊,把大於該基數的數放在該基數的右邊(排序結果有小到大,反之反之)。 (該基數在數組中的腳標是變動的,不要考慮比該基數小(大)的數較多,在其左(右)邊放不下的弱智腦殘問題) ...
  • 面向對象的概述 面向對象的概念在我理解來,函數是對代碼的封裝,而類和對象是對函數的封裝,其優點如下 面向過程:根據業務邏輯從上到下寫壘代碼 函數式:將某功能代碼封裝到函數中,日後便無需重覆編寫,僅調用函數即可 面向對象:對函數進行分類和封裝,讓開發“更快更好更強... 面向對象編程是一種編程方式,此 ...
  • 一、基於 XML 的 Bean 的配置 1.通過屬性註入 即通過 setXxx() 方法註入 Bean 的屬性值或依賴的對象。 使用 <property name="" value="" ref=""/> 元素,其中 name 值為對應 Bean 屬性名稱,value 指定對應屬性值,ref 引用其 ...
  • 一、學習版本 spring-framework-4.0.0 二、導入 jar 包: 三、在類路徑下創建 Spring Config 文件:ApplicationContext.xml 四、創建一個非侵入的 Bean 五、在 Spring Config 文件中配置該 Bean 六、通過 IOC 容器對 ...
  • 字元串:是以空字元\0為結尾的char數組 在程式中定義字元串的方法 1.字元串常量(字元串文字):是指位於一對雙引號中的任何字元,雙引號里的字元加上編譯器自動提供的結束標誌\0字元,作為一個字元串背儲存在記憶體里。它常常用作printf和puts的參數。 2.字元串數組:定義一個字元串數組時,必須讓 ...
  • 1. 在 Form 上放一個 TImage ,再一個 TText 到 Image 裡面,並將 Image1.StyleName 設定為 BtnStyle,如下: 2.接著放一個 TButton,將 StyleLookup 指定為 BtnStyle,按鈕就變成這個 Style,如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...