curator-client源码阅读笔记

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. }
    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
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. }
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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值