package com.hqyg.disjob.register.center;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.CloseableUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.hqyg.disjob.common.Constants;
import com.hqyg.disjob.common.util.LocalHost;
import com.hqyg.disjob.common.util.LoggerUtil;
import com.hqyg.disjob.register.auth.node.GlobalAuthNode;
import com.hqyg.disjob.register.repository.ZnodeApi;
import com.hqyg.disjob.register.repository.watch.listener.ConnectionStateListenerImpl;
import com.hqyg.disjob.register.rpc.EJobConstants;
import com.hqyg.disjob.register.rpc.SubscribeService;
import com.hqyg.disjob.register.rpc.ZookeeperRegistry;
import com.hqyg.disjob.register.utils.ZooKeeperRegistryUtils;
import com.hqyg.disjob.rpc.client.HURL;
/**
* RpcZKRegistry初始化,获取到ZooKeeper的client连接
*
* @author Disjob
* @data 创建时间:2016-5-19
*/
@Service("rpcZKRegistry")
public class RpcZKRegistry extends AbstractZKRegistryCenter
{
@Resource
private ZnodeApi znodeApi;
private CuratorFramework client;
@Resource
private ZookeeperRegistry zookeeperRegistry;
@Resource
private SubscribeService subscribeService;
@Value("${zk.host}")
private String ZKHost;
private String rpcRootUrl = Constants.ROOT+"/rpc";
public RpcZKRegistry()
{
}
public CuratorFramework getClient()
{
return client;
}
@PostConstruct
public void init()
{
LoggerUtil.debug("Ejob:Ejob server client init,RpcZKRegistry ZK server list is:"+ ZKHost);
Builder builder = CuratorFrameworkFactory.builder().connectString(ZKHost)
.retryPolicy(new ExponentialBackoffRetry(1500, 3));
builder.sessionTimeoutMs(6000);
builder.connectionTimeoutMs(6000);
builder.authorization(new GlobalAuthNode(ZKHost).getAuthInfos());
client = builder.build();
client.getConnectionStateListenable().addListener(new ConnectionStateListenerImpl());
client.start();
try{
client.blockUntilConnected(3, TimeUnit.SECONDS);
initRootNode();
}catch (final Exception ex){
RegistryExceptionHandler.handleException(ex);
}
ZooKeeperRegistryUtils.zookeeperRegistry = zookeeperRegistry;
zookeeperRegistry.setZkClient(client);
subscribeServer();
/* //应该所有节点都能监控到
RegisterUtils.watchRpc2Job(true, client, zookeeperRegistry);*/
}
@Override
protected boolean initRootNode()
{
return false;
}
@PreDestroy
public void dostory()
{
CloseableUtils.closeQuietly(client);
}
/**
* 订阅服务
* @param clientUrl
*/
public void subscribeServer(HURL clientUrl)
{
subscribeService.DoSubscribe(clientUrl);
}
/**
* 订阅服务,将服务信息放入本地缓存
*/
protected void subscribeServer()
{
List<String> groupList = new ArrayList<String>();
try
{
if(!znodeApi.checkExists(client, rpcRootUrl)){
znodeApi.createPersistent(client, rpcRootUrl, null);
}
groupList = client.getChildren().forPath(rpcRootUrl);
if(CollectionUtils.isNotEmpty(groupList)){
String ip = new LocalHost().getIp();
for(String group : groupList){
String groupNode = rpcRootUrl + EJobConstants.PATH_SEPARATOR + group;
List<String> serverNameList = client.getChildren().forPath(groupNode);
if(CollectionUtils.isNotEmpty(serverNameList)){
for(String serverName: serverNameList){
HURL hurl = new HURL(group , ip, serverName);
subscribeServer(hurl);
//这句只为初始化的时候存数据到本地缓存
subscribeService.doDiscover(hurl);
}
}
}
}
}
catch (Exception e)
{
LoggerUtil.error("get group by " + rpcRootUrl + " error ", e);
}
}
public SubscribeService getSubscribeService()
{
return subscribeService;
}
}