zookeeper
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
//建立该路径的监听事件
IZkChildListener iZkChildListener = new IZkChildListener() {
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
//currentChilds 路径列表,根据当前实例路径及总的路径列表,设置实例号
refreshKernelObj(kernel_obj, taskPathFileName, parentPath, currentChilds);
}
};
zkClient.subscribeChildChanges(subscribePath, iZkChildListener);//subscribePath 为 zookeeperGroup 分组 BasisConstants.ZOOKEEPER_BASE_PATH+"/"+businessObjName+"/"+group
//创建个临时路径,并触发监听事件
zkClient.createEphemeral(taskPath, DateUtils.getCurrDateTime());//taskPath 为实例的全路径(host ip pid taskName实例启动时创建的任务名)
/**
* 在kernel_obj中对taskPathFileName的数据进行刷新,刷新的根据是parentPath和currentChilds
* @param kernel_obj 注册内核
* @param taskPathFileName 目标文件名称 格式为createZKTaskPathFileName()方法的返回值
* @param parentPath 监控的地址
* @param currentChilds 其他路径列表
*/
public void refreshKernelObj(ConcurrentHashMap<String,Object> kernel_obj,String taskPathFileName,String parentPath, List<String> currentChilds){
//获取总数和当前数量,并且设置到kernel中
int count = 0;
int currentIdx = 0;
List<String> currentChilds_sort = new LinkedList<String>();
currentChilds_sort.addAll(currentChilds);
Collections.sort(currentChilds_sort);
for(int i=0;i<currentChilds_sort.size();i++){
String childPath = currentChilds_sort.get(i);
try{
String taskName_tmp = childPath.substring(childPath.lastIndexOf(BasisConstants.SPLIT_TASKNAME)+9);//jobId_i
String businessObjName = childPath.substring(0,childPath.indexOf("_"));//businessObjName
if(taskPathFileName.equals(childPath)){
currentIdx = count;
}
count++;
}catch (Exception e){
logger.error("内核刷新异常",e);
}
}
kernel_obj.put(BasisConstants.KERNELOBJ_GLOBAL_TASK_COUNT, count+"");
kernel_obj.put(BasisConstants.KERNELOBJ_GLOBAL_TASK_INDEX, currentIdx + "");//当前任务数
String registerFlg = BasisConstants.registerFlg;
if("true".equals(registerFlg)){
kernel_obj.put(BasisConstants.KERNELOBJ_GLOBAL_REGISTER_PATH,parentPath+"/"+taskPathFileName);//注册地址
kernel_obj.put(BasisConstants.KERNELOBJ_zkClient, zkClient);
}
}
******************************* 获取注册中心下interName该服务实例数
if(InetAddress.getByName(temp.split(":")[0]).isReachable(2500)){// ip:端口
connectedSingal = new CountDownLatch(1);
zooKeeper = new ZooKeeper(temp, ZookeeperConstants.SESSION_TIMEOUT, new ServerWatcher());//链接zookeeper org.apache.zookeeper.Watcher
connectedSingal.await(ZookeeperConstants.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
return zooKeeper;
}
if(zooKeeper.exists(interName, false) != null){
List<String> children = zooKeeper.getChildren(interName,false);
String infoStr = "";
for (String child : children) {
infoStr = URLDecoder.decode(child);
}
String[] response = {interName,children.size()+"",infoStr};//获取注册中心下interName该服务实例数
return response;
private static String getHostNameForLiunx() {
try {
return (InetAddress.getLocalHost()).getHostName();
} catch (UnknownHostException uhe) {
logger.debug("UnknownHostException", uhe);
String host = uhe.getMessage(); // host = "hostname: hostname"
if (host != null) {
int colon = host.indexOf(':');
if (colon > 0) {
return host.substring(0, colon);
}
}
return "UnknownHost";
}
}
public static String getHostName() {
if (System.getenv("COMPUTERNAME") != null) {
return System.getenv("COMPUTERNAME");
} else {
return getHostNameForLiunx();
}
}
public static String getIp(){
String hostname = getHostName();
try {
return InetAddress.getByName(hostname).getHostAddress();
} catch (UnknownHostException e) {
logger.debug("UnknownHostException", e);
}
return "UnknownHost";
}
public static String getPid(){
String name = ManagementFactory.getRuntimeMXBean().getName();
String pid = name.split("@")[0];
return pid;
}

浙公网安备 33010602011771号