package com.justdebugit.thrift.registry;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import org.apache.curator.framework.imps.CuratorFrameworkState;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.retry.RetryNTimes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
import com.justdebugit.thrift.constants.Constants;
public class DefaultCuratorFactory implements CuratorFactory{
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCuratorFactory.class);
private String connectString;//192.16.10.1:2181,192.16.10.2:2181,192.16.10.3:2181这种格式
private Integer connectTimeout;
private Integer sessionTimeout;
public DefaultCuratorFactory(String connString,Integer connectTimeout,Integer sessionTimeout) {
this.connectString = connString;
this.connectTimeout = connectTimeout;
this.sessionTimeout = sessionTimeout;
}
public DefaultCuratorFactory(String connString) {
this(connString, Constants.DEFAULT_CONNECT_TIMEOUT, Constants.DEFAULT_SESSION_TIMEOUT);
}
@Override
public CuratorFramework getCuratorClient() {
Preconditions.checkNotNull(connectString);
Builder builder = CuratorFrameworkFactory.builder()
.connectString(connectString).sessionTimeoutMs(sessionTimeout)
.retryPolicy(new RetryNTimes(Integer.MAX_VALUE, 100))
.connectionTimeoutMs(connectTimeout);
CuratorFramework client = builder.build();
client.start();
return client;
}
@Override
public NodeCache getNodeCache(CuratorFramework client, String path) {
Preconditions.checkArgument(client!=null && client.getState()==CuratorFrameworkState.STARTED,"client is not started");
NodeCache nodeCache = new NodeCache(client, path);
try {
nodeCache.start(true);////同步初始化,将zk节点数据写入pathCache
} catch (Exception e) {
LOGGER.error("starting nodeCache error "+e.getMessage());
throw new IllegalStateException(e.getMessage(), e);
}
return nodeCache;
}
@Override
public PathChildrenCache getPathChildrenCache(CuratorFramework client,
String path) {
Preconditions.checkArgument(client!=null && client.getState()==CuratorFrameworkState.STARTED,"client is not started");
PathChildrenCache childrenCache = new PathChildrenCache(client, path,true);
try {
childrenCache.start(StartMode.BUILD_INITIAL_CACHE);//同步初始化,将zk节点数据写入childrenCache
} catch (Exception e) {
LOGGER.error("starting nodeCache error "+e.getMessage());
throw new IllegalStateException(e.getMessage(), e);
}
return childrenCache;
}
public void setConnectString(String connectString) {
this.connectString = connectString;
}
public void setConnectTimeout(Integer connectTimeout) {
this.connectTimeout = connectTimeout;
}
public void setSessionTimeout(Integer sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
}