前言

  zkClient主要做了两件事情:

    一件是在session loss和session expire时自动创建新的ZooKeeper实例进行重连。

    另一件是将一次性watcher包装为持久watcher。后者的具体做法是简单的在watcher回调中,重新读取数据的同时再注册相同的watcher实例。

zkClient目前已经运用到了很多项目中,知名的有Dubbo、Kafka、Helix。

  zkClient jar包下载,或者直接添加maven依赖: http://mvnrepository.com/artifact/com.101tec/zkclient

正文

  直接上代码:

1.测试类  

package com.xbq.demo;
import java.io.IOException;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.IZkDataListener; /**
* @ClassName: ZkClientDemo
* @Description: TODO(zkClient 测试)
* @author xbq
* @date 2017-3-26 上午11:49:39
*/
public class ZkClientDemo { // 此demo使用的集群,所以有多个ip和端口
private static String CONNECT_SERVER = "192.168.99.138:2181,192.168.99.138:2182,192.168.99.138:2183";
private static int SESSION_TIMEOUT = 3000;
private static int CONNECTION_TIMEOUT = 3000;
private static ZkClient zkClient ; static {
zkClient = new ZkClient(CONNECT_SERVER, SESSION_TIMEOUT,CONNECTION_TIMEOUT,new MyZkSerializer());
} public static void main(String[] args) { add(zkClient);
// update(zkClient);
// delete(zkClient); // addDiGui(zkClient);
// deleteDiGui(zkClient); // subscribe(zkClient);
} /**
* @Title: add
* @Description: TODO(增加一个指定节点)
* @param @param zkClient 设定文件
* @return void 返回类型
* @throws
*/
public static void add(ZkClient zkClient){
// 如果不存在节点,就新建一个节点
if(!zkClient.exists("/config")){
zkClient.createPersistent("/config","javaCoder");
}
// 查询一下,看是否增加成功
String value = zkClient.readData("/config");
System.out.println("value===" + value);
} /**
* @Title: addSequential
* @Description: TODO(递归创建节点)
* @param @param zkClient 设定文件
* @return void 返回类型
* @throws
*/
public static void addDiGui(ZkClient zkClient){
// 递归创建节点
zkClient.createPersistent("/xbq/java/coder", true);
if(zkClient.exists("/xbq/java/coder")){
System.out.println("增加成功!");
}else {
System.out.println("增加失败!");
}
} /**
* @Title: delete
* @Description: TODO(删除指定节点)
* @param @param zkClient 设定文件
* @return void 返回类型
* @throws
*/
public static void delete(ZkClient zkClient){
// 存在节点才进行删除
if(zkClient.exists("/config")){
boolean flag = zkClient.delete("/config");
System.out.println("删除" + (flag == true ? "成功!" : "失败!"));
}
} /**
* @Title: deleteDiGui
* @Description: TODO(递归删除)
* @param @param zkClient 设定文件
* @return void 返回类型
* @throws
*/
public static void deleteDiGui(ZkClient zkClient){
// 存在节点才进行删除
if(zkClient.exists("/xbq")){
// 递归删除的时候 只传入 父节点就可以,如果传入 全部的节点,虽然返回的是true,但是依然是没有删除的,
// 因为zkClient将异常封装好了,进入catch的时候,会返回true,这是一个坑
boolean flag = zkClient.deleteRecursive("/xbq");
System.out.println("删除" + (flag == true ? "成功!" : "失败!"));
}
} /**
* @Title: update
* @Description: TODO(修改节点的值)
* @param @param zkClient 设定文件
* @return void 返回类型
* @throws
*/
public static void update(ZkClient zkClient){
if(zkClient.exists("/config")){
zkClient.writeData("/config", "testUpdate");
// 查询一下,看是否修改成功
String value = zkClient.readData("/config");
System.out.println("value===" + value);
}
} /**
* @Title: subscribe
* @Description: TODO(事件订阅, 可用于配置管理)
* 先订阅,再 操作增删改。(可多个 客户端订阅)
* @param @param zkClient 设定文件
* @return void 返回类型
* @throws
*/
public static void subscribe(ZkClient zkClient){
zkClient.subscribeDataChanges("/config/userName", new IZkDataListener() {
@Override
public void handleDataDeleted(String arg0) throws Exception {
System.out.println("触发了删除事件:" + arg0);
} @Override
public void handleDataChange(String arg0, Object arg1) throws Exception {
System.out.println("触发了改变事件:" + arg0 + "-->" + arg1);
}
}); try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}

2.自定义序列化类

package com.xbq.demo;

import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.serialize.ZkSerializer; import java.io.UnsupportedEncodingException; /**
* @ClassName: MyZkSerializer
* @Description: TODO(实现序列化接口,转为UTF-8编码)
* @author xbq
* @date 2017-3-26 上午11:56:22
*/
public class MyZkSerializer implements ZkSerializer{
@Override
public byte[] serialize(Object data) throws ZkMarshallingError {
try {
return String.valueOf(data).getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
} @Override
public Object deserialize(byte[] bytes) throws ZkMarshallingError {
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}

源码下载

  http://git.oschina.net/xbq8023/Zookeeper-Demo

ZooKeeper(四)-- 第三方客户端 ZkClient的使用的更多相关文章

  1. ZooKeeper:第三方客户端 ZKClient

    ZKClient ZKClient的设计 ZKClient组件说明 重要的处理流程说明 启动ZKClient 为节点注册Watcher ZooKeeper的变更操作 客户端处理变更 序列化处理 ZKC ...

  2. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

  3. [转载] ZooKeeper的Java客户端API

    转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...

  4. 【分布式】Zookeeper使用--开源客户端

    一.前言 上一篇博客已经介绍了如何使用Zookeeper提供的原生态Java API进行操作,本篇博文主要讲解如何通过开源客户端来进行操作. 二.ZkClient ZkClient是在Zookeepe ...

  5. 系列四TortoiseSvn客户端软件

    原文:系列四TortoiseSvn客户端软件 TortoiseSvn介绍 TortoiseSvn 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中 ...

  6. zookeeper的WEB客户端zkui使用

    转载自:http://blog.csdn.net/csolo/article/details/53694665 前面几篇实践说明了zookeeper如何配置和部署,如何开发,因为大多是后台操作,对于维 ...

  7. zookeeper 四字命令

    zookeeper四字命令   ZooKeeper3.4.6支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 te ...

  8. 02.ZooKeeper的Java客户端使用

    1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端     zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...

  9. 六:ZooKeeper的java客户端api的使用

    一:客户端链接测试 package com.yeepay.sxf.createConnection; import java.io.IOException; import org.apache.zoo ...

随机推荐

  1. tomcat logs 目录下各日志文件的含义

    tomcat每次启动时,自动在logs目录下生产以下日志文件,按照日期自动备份 localhost.2016-07-05.txt   //经常用到的文件之一 ,程序异常没有被捕获的时候抛出的地方 ca ...

  2. 从c++看js的那些概念

    感觉c++逐渐没落了,js正风生水起,各种概念层出不穷. reactjs,flux ,angularjs cmd,amd模块化设计. 初看起来好像很高端的样子,后来发现也不过是如此. c++毕竟经历了 ...

  3. 设计和开发ETL系统(一)——ETL过程综述

    在这部分将按照设计和实现ETL系统的流程展开,将上一个部分的那些子系统按照提取数据.清洗和一致化.向呈现服务器提交以及管理ETL环境等四个方面进行了分类.(是不是说对ETL主要就是掌握这四个方面的内容 ...

  4. PDNN安装与使用

    在之前写的一文"关于PDNN.Theano.Numpy以及Scipy的安装"中介绍了Theano的安装, 下面简单的介绍一下PDNN的安装与使用,哎,这个从学习的角度来讲自己亲自动 ...

  5. java——关于数组的定义 和 访问修饰符的修饰内容

    public class Shuzu { public static void main(String[] args) { // 定义数组 必须初始化长度,没有初始化要放数据 int[] in = { ...

  6. [转]Python Web部署方式总结

    学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了 ...

  7. 01 Developing Successful Oracle Application

    本章提要-------------------------------本章是概述性章节1. 介绍了了解数据库内部结构对于开发的重要性2. 介绍了如何才能开发好的数据库应用程序------------- ...

  8. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

  9. UML总结---UML中的事物和关系

    UML中的事物 名称 说明 图形 类 相同属性方法的集合 接口 类或组件提供的,可以完成特定功能的一组操作的集合 协作 合作的动作 用例 系统的一个功能 节点 代表可计算的资源 活动类 有多个线程的类 ...

  10. Linux中显示一个文件最后几行的命令

    tail -n 20 filename说明:显示filename最后20行. Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端 ...