1. 程式人生 > >Zookeeper客戶端API之建立會話(六)

Zookeeper客戶端API之建立會話(六)

Zookeeper對外提供了一套Java的客戶端API。本篇部落格主要講一下建立會話。

建立專案

首選,建立一個基於maven管理的簡單java工程。在pom檔案中引入zookeeper。

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.9</version>
</dependency>

編寫測試類

首選以最簡單的API為例。

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

其中,connectString表示要連線的zookeeper伺服器地址列表,格式為:192.168.0.1:2181。支援多個地址拼接,中間用逗號分隔。其中地址後面還可以拼接上zookeeper的操作路徑,比如:192.168.0.1:2181/zk/test。

sessionTimeout:會話超時時間,單位“毫秒”。通過心跳來監測會話的有效性。

watcher:監聽節點的狀態變化,如果發生變化則通知此watcher,做出相應處理。如果不需要監聽,則可設定為null。

測試程式碼:

package com.secbro.learn;

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

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

/**
 * Created by zhuzs on 2017/3/9.
 */
public class
TestSession implements Watcher{
private static CountDownLatch countDownLatch = new CountDownLatch(1); public static void main(String[] args) throws IOException { Long startTime = new Date().getTime(); ZooKeeper zooKeeper = new ZooKeeper("192.168.0.1:2181",5000,new TestSession()); try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("建立連線花費時間:" + (new Date().getTime() - startTime) + "ms"); System.out.println("連線狀態:" + zooKeeper.getState()); } public void process(WatchedEvent event) { System.out.println("Receive watcher event:" + event); if(Event.KeeperState.SyncConnected == event.getState()){ countDownLatch.countDown(); } } }

由於Zookeeper客戶端和伺服器建立會話是非同步過程,因此使用CountDownLatch來阻塞執行緒,等待伺服器建立完成,併發送事件通知。

列印結果為:

Receive watcher event:WatchedEvent state:SyncConnected type:None path:null
建立連線花費時間:9155ms
連線狀態:CONNECTED

其他介面

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
            boolean canBeReadOnly)

此方法多了一個canBeReadOnly引數,此引數表示當前會話是否支援“只讀”模式。

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
            long sessionId, byte[] sessionPasswd)

此方法允許傳入sessionId和sessionPasswd,目的是為了重複使用會話。通過以下方法獲得:

zooKeeper.getSessionId();
zooKeeper.getSessionPasswd()

然後作為引數建立新的連線。當sessionId和sessionPasswd不正確時,伺服器會返回Expired事件。