1. 程式人生 > >06_zookeeper原生Java API使用

06_zookeeper原生Java API使用

edev 集群 err main .com 連接狀態 com 通知 bool

【Zookeeper構造方法概述】

/**
     * 客戶端和zk服務端的連接是一個異步的過程
     * 當連接成功後,客戶端會收到一個watch通知
     *
     * ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
     *          long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)
     * 參數介紹
     * connectString:連接服務器的ip字符串
     *      比如:"192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181"
     *      可以是一個ip,也可以是多個ip,一個ip代表單機,多個ip代表集群
     *      也可以在ip後加路徑
     * sessionTimeout:超時時間,心跳收不到了,那就超時
     * watcher:通知事件,如果有對應的事件觸發,則會收到一個通知:如果不需要,那就設為null
     * sessionId:會話的id
     * sessionPasswd:會話密碼,當會話丟失後,可以依據sessionId和sessionPasswd重新獲取會話
     * canBeReadOnly:可讀,當這個物理機節點斷開後,還是可以讀到數據的,只是不能寫,
     *                此時數據被讀取到的可能是舊數據,一般設置為false,不推薦使用
     *
     
*/ public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)

【Zookeeper API 客戶端連接服務端例子】

package com.zk.demo;

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

/** * Created by HigginCui on 2018/9/20. */ public class ZkConnect implements Watcher{ public static final String zkServerPath = "127.0.0.1:2181"; public static final Integer timeout = 5000; /** * 客戶端和zk服務端的連接是一個異步的過程 * 當連接成功後,客戶端會收到一個watch通知 */ public static void
main(String[] args) throws Exception{ ZooKeeper zk = new ZooKeeper(zkServerPath,timeout,new ZkConnect()); for (int i=0;i<20;i++) { Thread.sleep(10); //休眠10ms,在這個過程中,連接狀態會從CONNECTING--->CONNECTED System.out.println(i+"---"+zk.getState()); } } @Override public void process(WatchedEvent watchedEvent) { System.err.println("收到zk的watch通知----" ); } }

【運行結果】

技術分享圖片

【使用CountDownLatch優化zk連接過程】

package com.zk.demo;

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

import java.util.concurrent.CountDownLatch;

public class ZkConnect implements Watcher{

    public static final String zkServerPath = "127.0.0.1:2181";

    public static final Integer timeout = 5000;

    private static CountDownLatch latch = new CountDownLatch(1);

    public static void main(String[] args) throws Exception{
        ZooKeeper zk = new ZooKeeper(zkServerPath,timeout,new ZkConnect());

        System.out.println("連接狀態---" + zk.getState());
        latch.await();
        System.out.println("連接狀態---" + zk.getState());

    }

    @Override
    public void process(WatchedEvent watchedEvent) {
        System.err.println("收到zk的watch通知----" );
        latch.countDown();
    }
}

【運行結果】

技術分享圖片

06_zookeeper原生Java API使用