package com.autonavi.tinfo.traffic.zookeeper;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.github.zkclient.IZkChildListener;
import com.github.zkclient.IZkStateListener;
import com.github.zkclient.ZkClient; public class DistributedZookeeper {
private static final Logger logger = LoggerFactory.getLogger(DistributedZookeeper.class);
private Lock lock = new ReentrantLock();// 锁对象
private int sessionTimeout;
private int connectionTimeout;
private String zkServerList;
// private String zkServerDir = "tmc-city-root-path";
private String subNode = "tmclr";
private String curPath;
private ZkClient zkClient;
private String[] resourcePath;
private String zookeeperPath; public String getZookeeperPath() {
return zookeeperPath;
} public void setZookeeperPath(String zookeeperPath) {
this.zookeeperPath = zookeeperPath;
} private ClassPathXmlApplicationContext context = null; private void start() {
if (context == null) {
context = new ClassPathXmlApplicationContext(resourcePath);
}
} private void destroy() {
if (context != null) {
// context.registerShutdownHook(); logger.info("destroyed current application!!!");
context.stop();
context.close();
context.destroy();
context.registerShutdownHook();
context = null;
}
} public void connect() throws Exception { if (this.zkClient != null) {
this.zkClient.close();
}
this.zkClient = new ZkClient(zkServerList, sessionTimeout, connectionTimeout); if (!zkClient.exists(zookeeperPath)) {
zkClient.createPersistent(zookeeperPath, null);
}
if (curPath == null) {
curPath = zkClient.createEphemeralSequential(zookeeperPath + "/" + subNode, "monitor".getBytes());
} try {
startWatchingTopicStatus();
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error(e.getMessage(), e);
logger.error("error occurs during sync data from zk");
System.exit(0);
}
Thread.sleep(2000);// */
handleMonitorNodeChange();
} public void startWatchingTopicStatus() {
ZkTopicStatusListener topicEventListener = new ZkTopicStatusListener();
ZkConnectedStatusListener connectedStatusListener = new ZkConnectedStatusListener();
try {
zkClient.subscribeChildChanges(zookeeperPath, topicEventListener);
zkClient.subscribeStateChanges(connectedStatusListener);
} catch (Exception e) {
logger.error(e.getMessage(), e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
startWatchingTopicStatus();
} } public void handleMonitorNodeChange() throws Exception {
this.lock.lock();
try {
if (zkClient == null)
return;
if (!zkClient.exists(zookeeperPath)) {
zkClient.createPersistent(zookeeperPath, null);
} // 确认curPath是否真的是列表中的最小节点
List<String> childs = zkClient.getChildren(zookeeperPath);
if (childs == null || childs.size() == 0) {
// 创建子节点
curPath = zkClient.createEphemeralSequential(zookeeperPath + "/" + subNode, "monitor".getBytes());
childs = zkClient.getChildren(zookeeperPath); }
Collections.sort(childs); String thisNode = curPath.substring((zookeeperPath + "/").length());
int index = childs.indexOf(thisNode);
if (index < 0) {
curPath = zkClient.createEphemeralSequential(zookeeperPath + "/" + subNode, "monitor".getBytes());
childs = zkClient.getChildren(zookeeperPath);
Collections.sort(childs);
thisNode = curPath.substring((zookeeperPath + "/").length());
index = childs.indexOf(thisNode);
} if (index == 0) {
// 确实是最小节点
start();
} else {
destroy();
}
} finally {
this.lock.unlock();
}
} class ZkTopicStatusListener implements IZkChildListener { @Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
handleMonitorNodeChange();
}
} class ZkConnectedStatusListener implements IZkStateListener { @Override
public void handleStateChanged(KeeperState state) throws Exception {
// TODO Auto-generated method stub ConnectedReadOnly
if (state.equals(KeeperState.SyncConnected) || state.equals(KeeperState.ConnectedReadOnly)) {
System.out.println("zookeeper start to be connected");
handleMonitorNodeChange();
} else if (state.equals(KeeperState.Disconnected)) {
destroy();
}
} @Override
public void handleNewSession() throws Exception {
// TODO Auto-generated method stub
} } public void stop() {
destroy();
if (zkClient == null) {
logger.warn("cannot shutdown already shutdown topic event watcher.");
return;
}
// stopWatchingTopicEvents();
zkClient.close();
zkClient = null;
} public void setZkServerList(String zkServerList) {
this.zkServerList = zkServerList;
} public int getSessionTimeout() {
return sessionTimeout;
} public void setSessionTimeout(int sessionTimeout) {
this.sessionTimeout = sessionTimeout;
} public int getConnectionTimeout() {
return connectionTimeout;
} public void setConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
} public String[] getResourcePath() {
return resourcePath;
} public void setResourcePath(String[] resourcePath) {
this.resourcePath = resourcePath;
} public static void main(String[] args) throws Exception {
DistributedZookeeper statusMonitor = new DistributedZookeeper();
try {
if (args.length < 5) {
logger.warn("incomplete parameters.");
System.exit(0);
} // statusMonitor.setZkServerList("10.17.133.73:2181,10.17.133.73:2182,10.17.133.73:2183");
// statusMonitor.setConnectionTimeout(5000);
// statusMonitor.setSessionTimeout(5000);
// statusMonitor.setResourcePath(args); statusMonitor.setZkServerList(args[0]);
statusMonitor.setConnectionTimeout(Integer.valueOf(args[1]));
statusMonitor.setSessionTimeout(Integer.valueOf(args[2]));
statusMonitor.setZookeeperPath(args[3]);
statusMonitor.setResourcePath(Arrays.copyOfRange(args, 4, args.length)); statusMonitor.connect(); Executors.newSingleThreadExecutor().awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (Exception e) {
logger.error(e.toString(), e);
statusMonitor.stop();
System.exit(0);
} catch (OutOfMemoryError e) {
logger.error(e.toString(), e);
statusMonitor.stop();
System.exit(0);
}
} }

#!/bin/sh
#zookeeper address
zkAddress=100.69.209.30:2181,100.69.207.28:2181,100.69.193.87:2181
#connection timeout  in  Millseconds
connectTimeOut=60000
#session timeout  in  Millseconds
sessionTimeOut=60000
zookeeperPath="/tmc-city-path-aone"

x=`echo $0 | grep "^/"`
if test "${x}"; then
    dir=`dirname $0`
else
    pwdv=`pwd`
    dir=`dirname ${pwdv}/$0`
fi
dir=`readlink -m $dir`
echo "app location : "$dir

run="nohup /opt/taobao/java/bin/java  -Xms2G  -Xmx6G -Duser.dir=$dir/..  -cp ${dir}/../etc:${dir}/../lib/* com.autonavi.tinfo.traffic.zookeeper.DistributedZookeeper $zkAddress $connectTimeOut $sessionTimeOut $zookeeperPath classpath:ctx/**/*.xml"
log="nohup.out"
app_dir=`echo $dir|awk -F'/' '{print $(NF-1)}'`
len=`expr ${#app_dir} / 3`
app_dir_blur=`expr substr $app_dir 1 $len`
shutdown="kill `ps -ef|grep /opt/taobao/java/bin/java  |grep $dir| awk '{print $2}'`"
sd_rb="kill `ps -ef|grep /opt/taobao/java/bin/java  |grep $app_dir_blur| awk '{print $2}'`"

stopApp() {
    echo "starting stop ..."
    pid=`ps -ef|grep /opt/taobao/java/bin/java |grep $dir| awk '{print $2}'`
    echo $pid
    if [ ! $pid ]; then
        echo "not find process to kill"
    else
        kill -9 $pid
        echo "kill -9 $pid successfully"
    fi
}

case $1 in
    start)
        $run >> $log 2>&1 &
        chmod 744  $log
        ;;
    stop)
        #$shutdown
        stopApp
        ;;
    restart)
        $shutdown &&
        $run >> $log 2>&1 &
        ;;
    rb)
        $sd_rb &&
        $run >> $log 2>&1 &
        ;;
    *)
        echo "usage: run.sh [start|stop|restart]"
esac

zookeeper启动。的更多相关文章

  1. zookeeper启动报错(数据目录权限不对)

    zookeeper启动报错日志: 2016-11-16 11:19:43,880 [myid:3] - INFO [WorkerReceiver[myid=3]:FastLeaderElection@ ...

  2. zookeeper启动异常

    zookeeper启动报异常 java.io.EOFException  at java.io.DataInputStream.readInt(DataInputStream.java:392) 遇到 ...

  3. Zookeeper启动时报8080端口被占用

    zookeeper启动时报8080 端口被占用,导致启动失败.特别是服务器上部署了tomcat服务时需要注意. 通过查看zookeeper的官方文档,发现有3种解决途径: (1)删除jetty. (2 ...

  4. zookeeper启动报错处理记录

    zookeeper启动时正常,查看状态时出错 处理,通过 ./zkServer.sh status 报错Error contacting service. It is probably not run ...

  5. zookeeper启动配置

    zookeeper安装和配置详解 转载 2014年04月16日 14:36:31 16812 摘自:http://www.ibm.com/developerworks/cn/opensource/os ...

  6. Zookeeper启动失败:java.net.BindException: Address already in use

    错误日志如下: [hadoop@master zookeeper-3.4.5-cdh5.10.0]$ cat zookeeper.out 2018-05-15 01:29:21,036 [myid:] ...

  7. zookeeper启动

    Zookeeper启动总结1.实际项目用的是Linux,问题不大,本地开发学习用Windows,问题多多.2.Zookeeper3.5.1-alpha,和本地JDK1.7,有冲突,无法正常启动.3.Z ...

  8. macos brew zookeeper,安装后zookeeper启动失败?

    一.Zookeeper安装流程 执行如下安装命令: brew install zookeeper 执行截图如下: 安装后查看 zookeeper 安装信息(默认拉取最新版本) brew info zo ...

  9. Zookeeper启动过程

    在上一篇,我们了解了zookeeper最基本的配置,也从中了解一些配置的作用,那么这篇文章中,我们将介绍Zookeeper的启动过程,我们在了解启动过程的时候还要回过头看看上一篇中各个配置参数在启动时 ...

  10. zookeeper启动错误 transaction type: 2 error: KeeperErrorCode = NoNode for /hbase

    hbase伪分布式,与zookeeper同一台机器的时候,运行一段时间,启动zookeeper的时候,日志中有如下错误,导致无法启动zookeeper java.io.IOException: Fai ...

随机推荐

  1. php dirname(__FILE__) 获取当前文件的绝对路径 (转)

    比如当前文件是放在(d:\www\)下,文件名是test.php. 测试的代码如下: 复制代码 代码如下: <?php echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\ ...

  2. django允许跨域备忘笔记

    详细信息请拜读网址:https://github.com/ottoyiu/django-cors-headers/ 安装: 在virtaulenv环境中执行 pip install django-co ...

  3. activity 和 生命周期: 消息通信

    实际上关于activity大概流程已经了解了,在深入的话方向应该是ams的处理操作和界面创建和view绘制.这些话题之后再谈,activity是一个gui程序,其中离不开的就是消息通讯,也就是在消息循 ...

  4. MINIX3 内核整体架构回顾及内核定 性分析

    MINIX3  内核整体架构回顾及内核定 性分析 12.1 注意事项 由于本文档不对 I/O 文件系统做出分析,所以在此不对 MINIX3 整体做出一个分 析,本章主要是针对内核进程分析.并且这里的模 ...

  5. C++中的初始化

    C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通过析构函数释放资源”,但实际中因类无构造函数时编译器将自动合成一个默认构造函数,该构造函数只服务于自身编译器构造需要而不负责对象成 ...

  6. 将Rmarkdown文件转为pdf文件

    knitr包只能够将R markdown文件转为html格式,若想要将其转化为pdf格式,还要安装另一个包 # Install and load package install.packages(&q ...

  7. CentOS6 下rsync服务器配置

    一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. Rsy ...

  8. Charles初体验

      背景: 谈起HTTP调试代理工具, 很多人第一反应就会提到Fiddler. 可惜Fiddler由C#编写, 对Mac电脑的支持并不友好(存在Mac版Fiddler--mono fiddler, 不 ...

  9. 初次学习c语言

    #include<stdio.h> main(){      int o,p,q; scanf("%d%d",&o,&p); q=o+p; printf ...

  10. js isnull 赋值方法

    <script>var b = 'test';var a = b || {};alert(a)</script> 结果:test <script>var b;var ...