本文为原创文章,转载请注明出处,谢谢

Zookeeper原生API使用

1、jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中

  

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>

2、创建zookeeper连接

  ZooKeeper(java.lang.String connectString, int sessionTimeout, org.apache.zookeeper.Watcher watcher)

    • connectString:zookeeper服务地址,例如“192.168.117.128:2181”
    • sessionTimeout :超时时间,单位为毫秒
    • watcher:实现org.apache.zookeeper.Watcher接口的实现类,需实现process(WatchedEvent watchedEvent) 方法

  ZooKeeper zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new MyWatcher());

示例代码:

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException; /**
*
* zookeeper连接
*/
public class CreateSession implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
System.out.println("做业务!");
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSession());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

  ps:此处没有新创建新的java类实现Watcher,而是直接在本类中实现Watcher接口并重写process方法

3、同步创建

  create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl, org.apache.zookeeper.CreateMode createMode)

    • path:创建节点路径,需保证父节点已存在
    • data:节点数据
    • acl:权限列表
      • 提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE

        • OPEN_ACL_UNSAFE:完全开放
        • CREATOR_ALL_ACL:创建该znode的连接拥有所有权限
        • READ_ACL_UNSAFE:所有的客户端都可读
      • 自定义权限  
        ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
        ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
        new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass")));
      • session设置权限 
        zk.addAuthInfo("digest", "id:pass".getBytes());  
    • createMode:节点类型
      • PERSISTENT:持久化节点
      • PERSISTENT_SEQUENTIAL:持久化有序节点
      • EPHEMERAL:临时节点(连接断开自动删除)
      • EPHEMERAL_SEQUENTIAL:临时有序节点(连接断开自动删除)

示例代码:  

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider; import java.io.IOException;
import java.security.NoSuchAlgorithmException; /**
* 创建节点(同步)
* Created by scot on 2016/6/8.
*/
public class CreateSessionSync implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
try {
if(null != zooKeeper.exists("/note_scot/note_scot_a",false)) {
System.out.println("/note_scot/note_scot_a 节点已存在");
return;
}
String path = zooKeeper.create("/note_scot/note_scot_a","aa".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); /*权限相关
try {
ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass")));
zooKeeper.addAuthInfo("digest", "id:pass".getBytes()); 
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}*/ System.out.println("zookeeper return:" + path);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSessionSync());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

4、异步创建

  create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl,

      org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.AsyncCallback.StringCallback cb, java.lang.Object ctx)

    • StringCallback cb:回调接口,执行创建操作后,结果以及数据发送到此接口的实现类中
    • Object ctx:自定义回调数据,在回调实现类可以获取此数据

示例代码:

import org.apache.zookeeper.*;

import java.io.IOException;

/**
* 创建节点(异步)
* Created by scot on 2016/6/8.
*/
public class CreateSessionASync implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
zooKeeper.create("/note_scot/note_scot_b","aa".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL,new IStringCallBack(),"testAsync");
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSessionASync());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} static class IStringCallBack implements AsyncCallback.StringCallback { @Override
public void processResult(int i, String s, Object o, String s2) {
System.out.println("i="+i);//创建成功返回0
System.out.println("s="+s);//自定义节点名称
System.out.println("o="+o);//自定义回调数据
System.out.println("s2="+s2);//最终节点名称(顺序节点最终名称与自定义名称不同) }
}
}

常用方法列表:

String create(final String path, byte data[], List acl, CreateMode createMode)

参数: 路径、 znode内容,ACL(访问控制列表)、 znode创建类型;

用途:创建znode节点

void delete(final String path, int version)

参数: 路径、版本号;如果版本号与znode的版本号不一致,将无法删除,是一种乐观加锁机制;如果将版本号设置为-1,不会去检测版本,直接删除;

用途:删除节点

Stat exists(final String path, Watcher watcher)

参数: 路径、Watcher(监视器);当这个znode节点被改变时,将会触发当前Watcher

用途:判断znode节点是否存在

Stat exists(String path, boolean watch)

参数: 路径、并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher;

判断znode节点是否存在

Stat setData(final String path, byte data[], int version)

参数: 路径、数据、版本号;如果为-1,跳过版本检查

用途:设置znode上的数据

byte[] getData(final String path, Watcher watcher, Stat stat)

参数: 路径、监视器、数据版本等信息

用途:获取znode上的数据

List getChildren(final String path, Watcher watcher)

参数: 路径、监视器;该方法有多个重载

用途:获取节点下的所有子节点

下一节:2.2ZkClient使用

(原) 2.1 Zookeeper原生API使用的更多相关文章

  1. Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话

    一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...

  2. zookeeper原生API做java客户端

    简介 本文是使用apache提供的原生api做zookeeper客户端 jar包 zookeeper-3.4.5.jar   Demo package bjsxt.zookeeper.base; im ...

  3. ZooKeeper 原生API操作

    zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话 ...

  4. ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用

    这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...

  5. ZooKeeper(七)-- ZK原生API实现分布式锁

    一.使用场景 在分布式应用,往往存在多个进程提供同一服务.这些进程有可能在相同的机器上,也有可能分布在不同的机器上. 如果这些进程共享了一些资源,可能就需要分布式锁来锁定对这些资源的访问. 二.实现分 ...

  6. Zookeeper系列2 原生API 以及核心特性watcher

    原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...

  7. curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API

    打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...

  8. ZooKeeper实现配置中心的实例(原生API实现)(转)

    说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...

  9. zookeeper zkClient api 使用

    操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...

随机推荐

  1. Docker实践:安装wordpress

    本文将示例如何使用Docker来安装wordpress.使用三种方法: 1.基于官方的wordpress镜像使用docker run实现: 2.基于官方的wordpress镜像使用fig命令编排工具实 ...

  2. Android RatingBar 自定义样式

    Android RatingBar 自定义样式 1.先定义Style: <style name="RadingStyle" parent="@android:sty ...

  3. Java抽象类的总结

    什么是抽象类: 当你在定义一个父级的类的时候,往往在父级内的方法没有添加任何内容,这时候如果你在子类里面调用父级的时候,万一在子类之中类名或者方法名没有写正确,会出现不执行的情况,但是这种情况默认是不 ...

  4. C#并行编程系列-文章导航

    菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...

  5. SSISDB8:使用SSISDB记录的消息Troubleshoot packages

    在执行Package时,SSISDB都会创建唯一的OperationID 和 ExecutionID,标识对package执行的操作和执行实例(Execution Instance),并记录opera ...

  6. 【Win10 应用开发】OCR识别

    OCR,即Optical Character Recognition,光学字符识别.以下介绍来自搜索: OCR(Optical Character Recognition,光学字符识别)是指电子设备( ...

  7. ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章

    上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据.   目录: ASP.N ...

  8. jQuery UI Datepicker使用介绍

    本博客使用Markdown编辑器编写 在企业级web开发过程中,日历控件和图表控件是使用最多的2中第三方组件.jQuery UI带的Datepicker,日历控件能满足大多数场景开发需要.本文就主要讨 ...

  9. 在Linux客户机与Windows宿主机之间建立共享(VitrualBox)

    VirtualBox中,如果客户机和宿主机都是Windows的话,共享相对是比较方便的.一般是通过\\vboxsvr\shared 这样的路径访问即可. 但是如果客户机是Linux的话,就略微麻烦一点 ...

  10. Java内存模型深度解析:重排序 --转

    原文地址:http://www.codeceo.com/article/java-memeory-2.html 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间 ...