连接Zookeeper操作

public class ZKConnector implements Watcher{
    private static final Logger logger =LoggerFactory.getLogger(ZKConnector.class);

    private CountDownLatch connectedSemaphore = new CountDownLatch(1);
    private ZooKeeper zk =null;

    /**
     * 释放zookeeper连接
     */
    public void releaseConnection() {
        if (this.zk!=null) {
            try {
                this.zk.close();
            } catch ( InterruptedException e ) {
                e.printStackTrace();
            }
        }
    } 

    /**
     * 创建zookeeper的连接
     * @param connectString zookeeper服务器地址列表
     * @param sessionTimeout Session超时时间
     */
     public void createConnection(String connectString, int sessionTimeout) {
             //先释放zookeeper连接
            this.releaseConnection();
            try {
                zk = new ZooKeeper( connectString, sessionTimeout, this);
                connectedSemaphore.await();
            } catch ( InterruptedException e ) {
                logger.info( "连接创建失败,发生 InterruptedException");
                e.printStackTrace();
            } catch (IOException e ) {
                logger.info( "连接创建失败,发生 IOException" );
                e.printStackTrace();
            }
        } 

     /**
      * 检查Znode是否为空
      */
     public boolean check(String zNode){
        try {
            return this.zk.exists(zNode, false).getDataLength()>0;
        } catch (KeeperException | InterruptedException e) {
            e.printStackTrace();
        }
        return false;
     }

     /**
      * 检查zNode是否存在
      * 不为空 返回true
      * 为空,则返回false
      */
     public boolean exist(String zNode){
        try {
                Stat stat =this.zk.exists(zNode, false);
                return stat==null?false:true;
            } catch (KeeperException | InterruptedException e) {
                e.printStackTrace();
            }
            return true;
     }

     /**
      * 读取zNode的数据
      */
     public String readData(String path){
         try {
                if(this.zk.exists(path, false) == null){
                    return "";
                }
                return new String( this.zk.getData(path, false, null));
            } catch ( KeeperException e){
                logger.info("读取数据失败,发生KeeperException,path: " + path);
                e.printStackTrace();
                return "";
            } catch ( InterruptedException e){
                logger.info("读取数据失败,发生 InterruptedException,path: " + path);
                e.printStackTrace();
                return "";
            }
     }

     /**
      * 更新zNode的数据
      */
     public boolean writeData(String path,String data){
         try {
                if(this.zk.exists(path, false) == null){
                    return createPersistNode(path,data);
                }else{
                    deleteNode(path);
                    createPersistNode(path,data);
                }
            } catch ( KeeperException e ) {
                logger.info( "更新数据失败,发生KeeperException,path: " + path  );
                e.printStackTrace();
            } catch ( InterruptedException e ) {
                logger.info( "更新数据失败,发生 InterruptedException,path: " + path  );
                e.printStackTrace();
            }
            return false;
     }

     /**
      * 获取子节点数据
      */
     public List<String> getChildren(String node){
         try {
            List<String> subNodes = this.zk.getChildren(node, false);
            return subNodes;
        } catch (KeeperException | InterruptedException e) {
            e.printStackTrace();
        }
        return null;
     }

    /**
     * 创建持久化节点
     * @param path 节点path
     * @param data    初始数据内容
     * @return
     */
    public  boolean createPersistNode(String path, String data) {
         try {
                String createpath =this.zk.create(path,data.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT );
                logger.info("节点创建成功, Path: "
                        + createpath
                        + ", content: " + data );
                return true;
            } catch ( KeeperException e ) {
                logger.info( "节点创建失败,发生KeeperException" );
                e.printStackTrace();
            } catch ( InterruptedException e ) {
                logger.info( "节点创建失败,发生 InterruptedException" );
                e.printStackTrace();
            }
            return false;
    }

    /**
     * 创建短暂序列化节点
     * @param path 节点path
     * @param data 初始数据内容
     * @param needWatch
     * @return
     */
    public  String createEsquentialNode(String path, String data) {
         String esquentialNode = null;
         try {
                 esquentialNode =this.zk.create(path,data.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
                logger.info("节点创建成功, Path: "
                        + esquentialNode
                        + ", content: " + data );
                return esquentialNode;
            } catch ( KeeperException e ) {
                logger.info( "节点创建失败,发生KeeperException" );
                e.printStackTrace();
            } catch ( InterruptedException e ) {
                logger.info( "节点创建失败,发生 InterruptedException" );
                e.printStackTrace();
            }
            return null;
    }

    /**
     * 删除节点
     */
     public void deleteNode(String path) {
        try {
            if(this.zk.exists(path, false) == null){
                logger.info("该节点不存在!不做任何操作" );
            }else{
                this.zk.delete(path, -1);
                logger.info("删除节点成功,path:"+ path);
            }
        } catch ( KeeperException e ) {
            logger.info("删除节点失败,发生KeeperException,path: " + path);
            e.printStackTrace();
        } catch ( InterruptedException e ) {
            logger.info("删除节点失败,发生 InterruptedException,path: " + path);
            e.printStackTrace();
        }
    } 

    @Override
    public void process(WatchedEvent event) {
        logger.info( "收到事件通知:" + event.getState() +"\n"  );
        if ( KeeperState.SyncConnected == event.getState() ) {
            connectedSemaphore.countDown();
        }
    }

}
时间: 2024-08-10 21:29:31

连接Zookeeper操作的相关文章

dubbo连接zookeeper注册中心因为断网导致线程无限等待问题

最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我不是运维人员也不懂运维相关的技术,所以排查了很久也不知道原因,最后无奈之下把深圳这边的网络切回了联通,系统恢复正常. 但是因为本次事故体现了一个很严重的问题,即当zookeeper注册中心连不上时dubbo的线程会无限等待,因为系统有一些定时任务会比较频繁地开启新线程连接dubbo,所以导致的结果是

怎样利用JDBC连接并操作Oracle数据库

之前学习.NET的时候.以前利用ODBC进行连接数据库,而在Java中通常採用JDBC连接数据库,这里以oracle数据库为例简单的总结一下利用JDBC怎样连接并操作数据库. 1.连接 public class DbUtil { public static Connection getConnection(){ Connection conn=null; try { Class.forName("oracle.jdbc.driver.OracleDriver");//找到oracle驱

VB语言使用ADO连接、操作SQLServer数据库教程

VB语言使用ADO连接.操作SQLServer数据库教程 这篇文章主要介绍了VB语言使用ADO连接.操作SQLServer数据库教程,本文讲解详细.代码中有大量注释,是非常好的一篇教程,需要的朋友可以参考下 几年前学过的VB几乎忘光了,这几天复习了下.VB连接ADO数据库并不是非常难. 连接第一步(要仔细看) 对于小白来讲,这里的教程最详细,连接ADO数据库第一步,要添加什么部件呢?全称是Microsoft ADO Data Control 6.0 (SP6) (OLEDB) 部件. 在Micr

ASP.net与SQLite数据库通过js和ashx交互(连接和操作)

ASP.net与SQLite数据库通过js和ashx交互(连接和操作): 废话(也是思路):用的是VS2010,打算做网站前后台.由于不喜欢前台语言里加些与html和css和js的其他内容,想实现前后台语言的分离,与前后台通过js的ajax实现交互,故很多百度出来的方法不成立,虽听说ashx过时,但是他实现了我要的效果:即前后台语言不是相互嵌入实现交互,而是通过js实现(有接口就可以).由于领导指定用SQLite,故这两天还折腾了SQLite,不过对于这种小型的网站,它是个很好的选择(不需要部署

VC++使用ActiveX控件连接和操作数据库

VS2008运用ActiveX控件连接和操作数据库关闭时一直有个内存释放的错误,好像使用VC6.0会多生成2个文件,就不会有问题. VC++使用ActiveX控件连接和操作数据库的方法分两种: 1.通过属性窗口连接数据库2.通过代码连接数据库 1.通过属性窗口连接数据库基本步骤:(1)创建一个基于对话框的应用程序ActiveXDB; (2)添加CAdodc控件:对话框上右键单击,选择Insert ActiveX control菜单项,弹出的对话框中选择Microsoft ADO Data Con

【j2ee spring】7、spring与数据库的连接的操作事务管理

spring与数据库的连接的操作事务管理 1.首先我们的知道spring管理事务的方式有两种 还是一种是以注解的方式 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚.这个例外是unchecked 如果遇到checked意外就不回滚. 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollb

Java连接并操作SQLServer数据库

本人只需在项目中引入sqljdbc4.jar 包即可 ----------------------------------------- 在JAVA中如何连接SQL Server数据库 - hanghangde的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/hanghangde/article/details/50463658 这篇文章说得很好,有链接 2000和 2008的服务器版本: Java连接SqlServer2008数据库首先下载JDBC:下载地址:

使用spring连接及操作mongodb3.0

前边有一篇记录过不使用spring,直接在java代码中连接和操作mongodb数据库,这里就紧随其后记录一下使用spring的情况下,在java中简单操作mongodb. maven导包配置: 因为涉及了sping以及springmvc,因此也需要导入它们相关的包: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc

python连接zookeeper的日志问题

用python连接zookeeper时,在终端里,一直会有zookeeper的日志冒出来,这样会很烦. 2014-07-22 10:06:19,544:10474(0x7fd459406700):[email protected][email protected]1557: Exceeded deadline by 11ms 解决方法是在连接后设置一下zookeeper的日志等级为ERROR,这样WARN的日志就不会弹出来了 import zookeeper zookeeper.set_debu