curator-client源码阅读笔记

来源:互联网 发布:html5 书籍 知乎 编辑:程序博客网 时间:2024/06/04 19:46
Zookeeper官方client使用起来有很多不便,比如session expire之后需要使用一个新的ZooKeeper对象,提供的接口过于底层等等

Curator是对ZooKeeper的一个封装,其中curator-client是最底层的一个封装,主要是提供自动重连的功能


入口类 CuratorZookeeperClient本身是一个很简单的封装,只保存了retryPolicy和ensembleProvider,真正的连接管理都交给了ConnectionState来处理
Java代码 复制代码 收藏代码
  1. public CuratorZookeeperClient(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider,int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy,boolean canBeReadOnly)
  2. {
  3. retryPolicy = Preconditions.checkNotNull(retryPolicy, "retryPolicy cannot be null");
  4. ensembleProvider = Preconditions.checkNotNull(ensembleProvider, "ensembleProvider cannot be null");
  5. this.connectionTimeoutMs = connectionTimeoutMs;
  6. state = new ConnectionState(zookeeperFactory, ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, tracer, canBeReadOnly);
  7. setRetryPolicy(retryPolicy);
  8. }



ConnectionState
Java代码 复制代码 收藏代码
  1. class ConnectionState implements Watcher, Closeable
  2. {
  3. private volatile long connectionStartMs = 0;
  4. private final Logger log = LoggerFactory.getLogger(getClass());
  5. //负责管理Zookeeper连接
  6. private final HandleHolder zooKeeper;
  7. private final AtomicBoolean isConnected =new AtomicBoolean(false);
  8. //zookeeper连接地址的provider
  9. private final EnsembleProvider ensembleProvider;
  10. private final int connectionTimeoutMs;
  11. private final AtomicReference<TracerDriver> tracer;
  12. private final Queue<Exception> backgroundExceptions =new ConcurrentLinkedQueue<Exception>();
  13. 用户自定义的watcher
  14. private final Queue<Watcher> parentWatchers =new ConcurrentLinkedQueue<Watcher>();
  15. ConnectionState(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider,int sessionTimeoutMs, int connectionTimeoutMs, Watcher parentWatcher, AtomicReference<TracerDriver> tracer,boolean canBeReadOnly)
  16. {
  17. this.ensembleProvider = ensembleProvider;
  18. this.connectionTimeoutMs = connectionTimeoutMs;
  19. this.tracer = tracer;
  20. if ( parentWatcher != null )
  21. {
  22. parentWatchers.offer(parentWatcher);
  23. }
  24. //ZooKeeper真正的连接还是由HandleHolder来管理,注意到第二个参数watcher,使用的是this
  25. zooKeeper = new HandleHolder(zookeeperFactory, this, ensembleProvider, sessionTimeoutMs, canBeReadOnly);
  26. }
  27. }

原创粉丝点击