上一篇文章这里已经列出了Curator的一个使用的例子,这篇文章将详细分析其初始化和启动部分。
测试程序分析
1 初始化和启动
(1) newClient方法返回CuratorFramework接口对象:
public static CuratorFramework newClient(String connectString, int sessionTimeoutMs,int connectionTimeoutMs,RetryPolicy retryPolicy)
{
return builder().
connectString(connectString).
sessionTimeoutMs(sessionTimeoutMs).
connectionTimeoutMs(connectionTimeoutMs).
retryPolicy(retryPolicy).
build();
}
看看builder()方法:
//返回用于构建CuratorFramework的新的builder对象
publicstaticBuilder builder()
{
return new Builder();
}
可以看到这个方法返回一个构建CuratorFramework的Builder。Builder类就在CuratorFrameworkFactory.java文件中。
//设置连接到的ZooKeeper集群的地址列表
public BuilderconnectString(String connectString)
{
ensembleProvider =newFixedEnsembleProvider(connectString);
return this;
}
前面方法都是设置当前对象的属性,然后将当前Builder对象返回,设置的属性可以看到包括这些:
private EnsembleProvider ensembleProvider;
private int sessionTimeoutMs =DEFAULT_SESSION_TIMEOUT_MS;
private int connectionTimeoutMs =DEFAULT_CONNECTION_TIMEOUT_MS;
private int maxCloseWaitMs =DEFAULT_CLOSE_WAIT_MS;
private RetryPolicy retryPolicy;
private ThreadFactory threadFactory =null;
private String namespace;
private String authScheme =null;
private byte[] authValue =null;
private byte[] defaultData =LOCAL_ADDRESS;
private CompressionProvidercompressionProvider=DEFAULT_COMPRESSION_PROVIDER;
private ZookeeperFactory zookeeperFactory =DEFAULT_ZOOKEEPER_FACTORY;
private ACLProvider aclProvider =DEFAULT_ACL_PROVIDER;
private boolean canBeReadOnly =false;
主要看最后一个build()方法:
//使用当前的Builder对象构建一个CuratorFramework接口对象
public CuratorFramework build()
{
return new CuratorFrameworkImpl(this);
}
可以看到创建一个CuratorFrameworkImpl实例,将当前Builder对象传递进去。
CuratorFrameworkImpl类是CuratorFramework接口的实现类,看看其构造函数:
public CuratorFrameworkImpl(CuratorFrameworkFactory.Builder builder)
{
ZookeeperFactory localZookeeperFactory= makeZookeeperFactory(builder.getZookeeperFactory());
this.client =new CuratorZookeeperClient(localZookeeperFactory, builder.getEnsembleProvider(),builder.getSessionTimeoutMs(), builder.getConnectionTimeoutMs(),new Watcher()
{
@Override
public void process(WatchedEvent watchedEvent)
{
CuratorEvent event = newCuratorEventImpl(CuratorFrameworkImpl.this, CuratorEventType.WATCHED,watchedEvent.getState().getIntValue(),unfixForNamespace(watchedEvent.getPath()),null,null,null,null,null, watchedEvent,null);
processEvent(event);
}
}, builder.getRetryPolicy(),builder.canBeReadOnly());
listeners = new ListenerContainer<