zookeeper进阶(一)客户端建立连接及相应的源码分析

本文详细解析了Zookeeper客户端连接的实现过程,包括ZkClient的创建、Watcher接口的使用,以及源码分析。通过CountDownLatch实现连接成功的判断,并探讨了ClientCnxn中的SendThread和EventThread在连接与事件处理中的作用。文章通过源码揭示了连接建立、服务端响应以及回调到Watcher的详细流程。
摘要由CSDN通过智能技术生成

目录

  • 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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值