curator-client源码阅读笔记
Zookeeper官方client使用起来有很多不便,比如session expire之后需要使用一个新的ZooKeeper对象,提供的接口过于底层等等
Curator是对ZooKeeper的一个封装,其中curator-client是最底层的一个封装,主要是提供自动重连的功能
入口类 CuratorZookeeperClient本身是一个很简单的封装,只保存了retryPolicy和ensembleProvider,真正的连接管理都交给了ConnectionState来处理
ConnectionState
Curator是对ZooKeeper的一个封装,其中curator-client是最底层的一个封装,主要是提供自动重连的功能
入口类 CuratorZookeeperClient本身是一个很简单的封装,只保存了retryPolicy和ensembleProvider,真正的连接管理都交给了ConnectionState来处理
- public CuratorZookeeperClient(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy, boolean canBeReadOnly)
- {
- retryPolicy = Preconditions.checkNotNull(retryPolicy, "retryPolicy cannot be null");
- ensembleProvider = Preconditions.checkNotNull(ensembleProvider, "ensembleProvider cannot be null");
- this.connectionTimeoutMs = connectionTimeoutMs;
- state = new ConnectionState(zookeeperFactory, ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, tracer, canBeReadOnly);
- setRetryPolicy(retryPolicy);
- }
ConnectionState
- class ConnectionState implements Watcher, Closeable
- {
- private volatile long connectionStartMs = 0;
- private final Logger log = LoggerFactory.getLogger(getClass());
- //负责管理Zookeeper连接
- private final HandleHolder zooKeeper;
- private final AtomicBoolean isConnected = new AtomicBoolean(false);
- //zookeeper连接地址的provider
- private final EnsembleProvider ensembleProvider;
- private final int connectionTimeoutMs;
- private final AtomicReference<TracerDriver> tracer;
- private final Queue<Exception> backgroundExceptions = new ConcurrentLinkedQueue<Exception>();
- 用户自定义的watcher
- private final Queue<Watcher> parentWatchers = new ConcurrentLinkedQueue<Watcher>();
- ConnectionState(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher parentWatcher, AtomicReference<TracerDriver> tracer, boolean canBeReadOnly)
- {
- this.ensembleProvider = ensembleProvider;
- this.connectionTimeoutMs = connectionTimeoutMs;
- this.tracer = tracer;
- if ( parentWatcher != null )
- {
- parentWatchers.offer(parentWatcher);
- }
- //ZooKeeper真正的连接还是由HandleHolder来管理,注意到第二个参数watcher,使用的是this
- zooKeeper = new HandleHolder(zookeeperFactory, this, ensembleProvider, sessionTimeoutMs, canBeReadOnly);
- }
- }