目录
- zookeeper创建客户端连接简单实现
- 对应源码分析
zookeeper客户端建立连接
package zk;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
public class ZkClient implements Watcher {
static CountDownLatch connectedSignal = new CountDownLatch(1);
ZooKeeper zk = null;
@Override
public void process(WatchedEvent event) {
if(event.getState() == KeeperState.SyncConnected){
connectedSignal.countDown();
}
}
public static void main(String[] args) {
ZkClient cg = new ZkClient ();
cg.connect(args[0]);
}
private void connect(String hosts) {
try {
zk = new ZooKeeper(hosts, 1000, this);
connectedSignal.await();
System.out.println("zk connect successfully");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面的代码创建了一个ZkClient 类,实现了Watcher接口,这个接口除了KeeperState、EventType两个枚举值,只有process一个方法
abstract public void process(WatchedEvent event);
调用ZooKeeper的构造函数 new ZooKeeper(hosts, 1000, this),会创建新的线程去做真正的连接操作,构造函数就立即返回了。第三个参数会把this(Watcher实例)传过去,创建成功之后会回调Watcher的process方法。
这边我们用了一个CountDownLatch,直到回调了process并且event.getState() == KeeperState.SyncConnected的时候才判断为连接成功,connectedSignal.countDown(),此时才会打印”zk connect successfully”。
对应源码分析
下面通过源码的阅读,看下具体是怎样做的连接,连接成功后进行的回调,进一步理解一下。
上面的图片形象的描述了client连接server,进行连接、请求的过程。
public class ZooKeeper {
private final ZKWatchManager watchManager = new ZKWatchManager();
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
throws IOException
{
watchManager.defaultWatcher = watcher;
cnxn = new ClientCnxn(connectString, sessionTimeout, this, watchManager);
cnxn.start();
}
}