使用java操作zookeeper(五)

之前使用的客户端是3.4.6,后来换成了3.5.3-beta 版本,前面的知识中也有对3.5.x一些知识点的补充,往后的客户端版本都使用该版本,下面的介绍也是基于3.5.3-beta的。

参考官网
http://zookeeper.apache.org/doc/r3.5.3-beta/api/org/apache/zookeeper/ZooKeeper.html

java操作zookeeper

pom添加依赖
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.3-beta</version>
</dependency>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
主类:org.apache.zookeeper.ZooKeeper

这是ZooKeeper客户端库的主要类。要使用ZooKeeper服务,应用程序必须首先实例化ZooKeeper类的对象。所有操作zookeeper的操作都将通过调用ZooKeeper类的方法来完成。除非另有说明,否则此类的方法是线程安全的。
客户端与服务器建立连接后,会为客户端分配一个会话ID。客户端将定期向服务器发送心跳以保持会话有效。只要客户端的会话ID保持有效,应用程序就可以通过客户端调用ZooKeeper API。
如果由于某种原因,客户端长时间无法向服务器发送心跳(例如,超过sessionTimeout值),则服务器将使会话到期,并且会话ID将失效。客户端对象将不再可用。要进行ZooKeeper API调用,应用程序必须创建一个新的客户端对象。
如果客户端当前连接的ZooKeeper服务器出现故障或者没有响应,则客户端将在其sessionID到期之前自动尝试连接到另一台zookeeper服务器。如果成功,应用程序可以继续使用客户端。
ZooKeeper API方法有同步或异步两种。同步方法会阻塞,直到服务器响应。异步方法只是将发送请求排队并立即返回。它们采用一个回调对象,该回调对象将在成功执行请求时执行,或者在错误时执行,并返回指示错误的返回代码。
一些成功的ZooKeeper API调用可以将监视(Watcher)留在ZooKeeper服务器中的“数据节点”上。其他成功的ZooKeeper API调用可以触发这些Watcher。一旦Watcher被触发,事件将被传递给客户,假如Watcher触发之后,立刻get节点信息,客户端在得到 Watch 消息之前肯定不可能看到更新后的数据。换句话说,更新通知先于更新结果。Watch 只会被触发一次。如果客户端想得到后续更新的通知,必须要在 Watch 被触发后重新注册一个 Watch。
当客户端丢失当前连接后重新连接服务器,所有被认为是触发的监视器,但是没有送达的事件将丢失。为了模式这个场景,客户端将产生一个特殊的事件,去告诉事件处理器连接被删除。这个特殊的事件的类型是EventNone 状态是KeeperStateDiscounnected。

ZooKeeper类有如下几个构造器:
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, HostProvider aHostProvider);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, HostProvider aHostProvider, ZKClientConfig clientConfig);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, ZKClientConfig clientConfig);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly, HostProvider aHostProvider);
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, ZKClientConfig clientConfig);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意:每个构造器创建连接都是异步的,构造方法启动与服务器的连接,然后立马返回,此时会话处于CONNECTING状态,通过watcher通知。此通知可以在构造方法调用返回之前或之后的任何时候到来。会话创建成功之后,状态会改为CONNECTED。
构造器将抛出两个异常:
java.io.IOException - 在网络故障的情况下
java.lang.IllegalArgumentException - ZooKeeper无效服务列表,或者 指定了无效的chroot路径(下面介绍connectString参数时会介绍chroot)

参数介绍:
参数名描述
connectString要创建ZooKeeper客户端对象,应用程序需要传递一个连接字符串,其中包含逗号分隔的host:port列表,每个对应一个ZooKeeper服务器。例如:127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183实例化的ZooKeeper客户端对象将从connectString中选择一个任意服务器并尝试连接到它。如果建立连接失败,将尝试连接字符串中的另一个服务器(顺序是非确定性的,因为是随机),直到建立连接。客户端将继续尝试,直到会话显式关闭。在3.2.0版本之后,也可以在connectString后面添加后缀字符串,如:127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183/app/a,客户端连接上ZooKeeper服务器之后,所有对ZooKeeper的操作,都会基于这个根目录。例如,客户端对/foo/bar的操作,都会指向节点/app/a/foo/bar——这个目录也叫Chroot,即客户端隔离命名空间。
sessionTimeout会话超时(以毫秒为单位)客户端和服务端连接创建成功之后,ZooKeeper中会建立一个会话,在一个会话周期内,ZooKeeper客户端和服务端之间会通过心跳检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效的心跳检测,会话就会失效。
watcher创建ZooKeeper客户端对象时,ZooKeeper允许客户端在构造方法中传入一个接口Watcher(org.apache.zookeeper.Watcher)的实现类对象来作为默认的Watcher事件通知处理器。当然,该参数可以设置为null以表明不需要设置默认的Watcher处理器。如果设置为null,日志中会有空指针异常,但是并不影响使用。
canBeReadOnly3.4之后添加的boolean类型的参数,用于标识当前会话是否支持“read-only”模式。默认情况下,在ZooKeeper集群中,一个机器如果和集群中过半以上机器失去了网络连接,那么这个机器将不再处理客户端请求(包括读写请求)。但是在某些使用场景下,当ZooKeeper服务器发生此类故障的时候,我们还是希望ZooKeeper服务器能够提供读服务(当然写服务肯定无法提供)——这就是ZooKeeper的“read-only”模式。
sessionId 和 sessionPasswd会话id和 会话密码,这两个参数能够唯一确定一个会话,同时客户端使用这两个参数实现客户端会话复用,从而达到恢复会话的效果,使用方法:第一次连接上ZooKeeper服务器后,客户端使用getSessionId()和getSessionPasswd()获取这两个值,如果需要会话复用,在重新创建ZooKeeper客户端对象的时候可以传过去,如果不需要会话复用,请使用不需要这些参数的其他构造函数。
HostProvider客户端地址列表管理器

关于列表管理器,具体参考博客:
从Paxos到Zookeeper 分布式一致性原理与实践7.3.2章_服务器地址列表
https://blog.csdn.net/en_joker/article/details/79310801
ZKClientConfig:3.5.2版本之后添加的参数,传递此conf对象为每个客户端提供了与其他实例相比不同的配置属性,更加的灵活性。

常用javaAPI调用
package com.zookeeper.test;

import org.apache.zookeeper.*;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.data.Stat;

import java.util.Collections;
import java.util.List;

/**

  • @author: WangSaiChao
  • @date: 2018/9/10
  • @description:
    */
    public class TestZookeeper implements Watcher{

public static void main(String[] args) throws Exception {

<span class="token comment">//===============================创建会话======================================</span>

<span class="token comment">/**
 * 使用第一个构造器创建会话,刚创建完立刻打印会话状态为 CONNECTING
 * 线程阻塞5秒,这5秒期间收到了服务端的Watcher通知 SyncConnected
 * 之后会话状态为 CONNECTED
 */</span>
ZooKeeper zookeeper1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ZooKeeper</span><span class="token punctuation">(</span><span class="token string">"127.0.0.1:2181,192.168.1.198:2181,172.12.96.123:2181"</span><span class="token punctuation">,</span> <span class="token number">5000</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TestZookeeper</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>zookeeper1<span class="token punctuation">.</span><span class="token function">getState</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>zookeeper1<span class="token punctuation">.</span><span class="token function">getState</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 使用第三个构造器,sessionId 和 sessionPasswd用的是上一个连接
 */</span>
<span class="token keyword">long</span> sessionId <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">getSessionId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> sessionPasswd <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">getSessionPasswd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ZooKeeper zookeeper2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ZooKeeper</span><span class="token punctuation">(</span><span class="token string">"127.0.0.1:2181"</span><span class="token punctuation">,</span> <span class="token number">5000</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TestZookeeper</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>sessionId<span class="token punctuation">,</span>sessionPasswd<span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>zookeeper2<span class="token punctuation">.</span><span class="token function">getState</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>zookeeper2<span class="token punctuation">.</span><span class="token function">getState</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment">//===============================创建节点======================================</span>
<span class="token comment">/**
 * CreateMode
 *    PERSISTENT : 持久节点
 *    PERSISTENT_SEQUENTIAL : 持久顺序节点
 *    EPHEMERAL : 临时节点
 *    EPHEMERAL_SEQUENTIAL : 临时顺序节点
 *
 * 无论是同步还是异步接口,ZooKeeper都不支持递归创建,即无法在父节点不存在的情况下创建一个子节点。
 * 另外,如果一个节点已经存在了,那么创建同名节点的时候,会抛出NodeExistException异常。如果是顺序节点,那么永远不会抛出NodeExistException异常
 * 临时节点不能有子节点,创建节点时,如果给定的父节点是临时节点,则会抛出NoChildrenForEphemeralsException
 * 创建节点同时,也可以在节点上设置Watcher 当删除节点或者setData时,将会触发Watcher
 */</span>


<span class="token comment">/**
 * 同步创建一个持久节点,ACL为 world:anyone:cdrwa 等同于如下命令:
 * create /node 123 world:anyone:cdrwa
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"/node"</span><span class="token punctuation">,</span>
    <span class="token string">"123"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    ZooDefs<span class="token punctuation">.</span>Ids<span class="token punctuation">.</span>OPEN_ACL_UNSAFE<span class="token punctuation">,</span>
    CreateMode<span class="token punctuation">.</span>PERSISTENT<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 同步创建一个持久节点,ACL为 world:anyone:cdrwa 所有人只拥有创建的权限,等同于如下命令:
 * create /node1 123 world:anyone:c
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"/node1"</span><span class="token punctuation">,</span>
    <span class="token string">"123"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    Collections<span class="token punctuation">.</span><span class="token function">singletonList</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ACL</span><span class="token punctuation">(</span>ZooDefs<span class="token punctuation">.</span>Perms<span class="token punctuation">.</span>CREATE<span class="token punctuation">,</span> ZooDefs<span class="token punctuation">.</span>Ids<span class="token punctuation">.</span>ANYONE_ID_UNSAFE<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    CreateMode<span class="token punctuation">.</span>PERSISTENT<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 异步创建一个 临时的顺序节点,ACL为 ip:127.0.0.1:c 等同于如下命令:
 * create /node2 123 ip:127.0.0.1:c
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"/node2"</span><span class="token punctuation">,</span>
    <span class="token string">"123"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    Collections<span class="token punctuation">.</span><span class="token function">singletonList</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ACL</span><span class="token punctuation">(</span>ZooDefs<span class="token punctuation">.</span>Perms<span class="token punctuation">.</span>CREATE<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Id</span><span class="token punctuation">(</span><span class="token string">"ip"</span><span class="token punctuation">,</span> <span class="token string">"127.0.0.1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    CreateMode<span class="token punctuation">.</span>EPHEMERAL_SEQUENTIAL<span class="token punctuation">,</span>
    <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>StringCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token annotation punctuation">@Override</span>
      <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">,</span> String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"name:"</span> <span class="token operator">+</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
 * 注意这里,线程睡眠20秒,因为是创建的临时节点,如果不睡眠,你不能使用命令在控制台看见创建的临时节点
 */</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">20000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment">/**
 * 异步创建一个持久节点, ACL为 digest:wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=:cdrwa,等同于如下命令:
 * create /node3 123 digest:wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=:cdrwa
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span>
    <span class="token string">"123"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    Collections<span class="token punctuation">.</span><span class="token function">singletonList</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ACL</span><span class="token punctuation">(</span>ZooDefs<span class="token punctuation">.</span>Perms<span class="token punctuation">.</span>ALL<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Id</span><span class="token punctuation">(</span><span class="token string">"digest"</span><span class="token punctuation">,</span> <span class="token string">"wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw="</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    CreateMode<span class="token punctuation">.</span>PERSISTENT<span class="token punctuation">,</span>
    <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>StringCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token annotation punctuation">@Override</span>
      <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">,</span> String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"name:"</span> <span class="token operator">+</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
 * 注意这里,线程睡眠20秒,可以接收到watcher
 */</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">20000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 创建一个持久顺序定时节点,如果在10000毫秒内 未修改node,并且没有子节点,那么它将被删掉
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"/node4"</span><span class="token punctuation">,</span>
    <span class="token string">"123"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    Collections<span class="token punctuation">.</span><span class="token function">singletonList</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ACL</span><span class="token punctuation">(</span>ZooDefs<span class="token punctuation">.</span>Perms<span class="token punctuation">.</span>ALL<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Id</span><span class="token punctuation">(</span><span class="token string">"digest"</span><span class="token punctuation">,</span> <span class="token string">"wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw="</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    CreateMode<span class="token punctuation">.</span>PERSISTENT_SEQUENTIAL_WITH_TTL<span class="token punctuation">,</span>
    <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>Create2Callback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token annotation punctuation">@Override</span>
      <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">,</span> String name<span class="token punctuation">,</span> Stat stat<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"name:"</span> <span class="token operator">+</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"stat:"</span> <span class="token operator">+</span> stat<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">,</span> <span class="token number">10000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">20000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment">//===============================获取节点数据======================================</span>

<span class="token comment">/**
 * 每一步操作/node3都要先执行该语句
 * 因为上一步创建的node3 添加了 digest ACL 所以在获取该节点信息的时候,要先添加授权
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">addAuthInfo</span><span class="token punctuation">(</span><span class="token string">"digest"</span><span class="token punctuation">,</span><span class="token string">"wangsaichao:123456"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 同步调用
 * path 节点路径
 * Watcher 监视
 * Stat 节点统计信息
 * 添加授权之后同步获取节点信息,返回给定路径的节点的数据和统计信息
 * 如果调用成功,并且watcher参数不为空,则会在具有给定路径的节点上保留监视,当删除节点 或者 setData时候将会触发监视
 *
 */</span>
<span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> data <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">getData</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TestZookeeper</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Stat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
 * 注意这里,线程睡眠2秒,因为是创建的临时节点,如果不睡眠,你不能使用命令在控制台看见创建的临时节点
 */</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 异步调用
 * path 节点路径
 * watch true使用创建zookeeper时指定的默认watcher 如果为false则不设置监听
 * DataCallback 异步通知
 * ctx 回调上下文
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">getData</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>DataCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">,</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> data<span class="token punctuation">,</span> Stat stat<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"data:"</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"stat:"</span> <span class="token operator">+</span> stat<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//===============================修改节点数据======================================</span>

<span class="token comment">/**
 * setData节点有version这一参数,给定版本与节点的版本匹配,则设置给定路径的节点的数据(如果给定版本是-1,则它匹配任何节点的版本)。返回节点的统计信息。
 * 如果不存在具有给定路径的节点,则将抛出NoNodeException
 * 如果给定版本与节点的版本不匹配,将抛出BadVersionException
 * 设置的数据最大允许大小为1 MB
 */</span>

<span class="token comment">/**
 * 每一步操作/node3都要先执行该语句
 * 因为上一步创建的node3 添加了 digest ACL 所以在获取该节点信息的时候,要先添加授权
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">addAuthInfo</span><span class="token punctuation">(</span><span class="token string">"digest"</span><span class="token punctuation">,</span><span class="token string">"wangsaichao:123456"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 同步设置数据 -1匹配任何版本
 */</span>
Stat stat <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span> <span class="token string">"嗨喽"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>stat<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 异步设置数据
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span> <span class="token string">"helloword"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>StatCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">,</span> Stat stat<span class="token punctuation">)</span> <span class="token punctuation">{</span>

    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"stat:"</span> <span class="token operator">+</span> stat<span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//===============================删除节点======================================</span>

<span class="token comment">/**
 * 删除给定路径的节点。如果存在这样的节点,则调用将成功,并且给定版本与节点的版本匹配(如果给定版本为-1,则它匹配任何节点的版本)。
 * 如果节点不存在,将抛出NoNodeException。
 * 如果给定版本与节点的版本不匹配,将抛出BadVersionException。
 * 如果节点有子节点,将抛出NotEmptyException。
 * 如果成功将触发现有API调用留下的给定路径节点上的所有监视,以及getChildren API调用留下的父节点上的监视。
 */</span>



<span class="token comment">/**
 * 同步删除节点
 * path 节点路径
 * version 版本号 -1 代表匹配所有版本
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token string">"/node1"</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 异步删除节点
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token string">"/node2"</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>VoidCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//===============================判断节点是否存在======================================</span>

<span class="token comment">/**
 * 返回给定路径的节点的stat。如果不存在这样的节点,则返回null。
 * 如果wathher非空并且调用成功(不会抛出异常),则会在具有给定路径的节点上保留监视。wather将由创建/删除节点或在节点上设置数据的成功时触发。
 */</span>

<span class="token comment">/**
 * 同步检查节点是否存在,并留下监听
 */</span>
Stat exists <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token string">"/node2"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Watcher</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">process</span><span class="token punctuation">(</span>WatchedEvent event<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"留下监视"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"判断节点是否存在:"</span><span class="token operator">+</span>exists<span class="token punctuation">)</span><span class="token punctuation">;</span>



<span class="token comment">/**
 * 异步检查节点是否存在,并留下监听
 */</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token string">"/node2"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Watcher</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">process</span><span class="token punctuation">(</span>WatchedEvent event<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"留下监视"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">AsyncCallback<span class="token punctuation">.</span>StatCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">processResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> rc<span class="token punctuation">,</span> String path<span class="token punctuation">,</span> Object ctx<span class="token punctuation">,</span> Stat stat<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"rc:"</span> <span class="token operator">+</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"path:"</span> <span class="token operator">+</span> path<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ctx:"</span> <span class="token operator">+</span> ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"判断节点是否存在:"</span> <span class="token operator">+</span> stat<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"传给服务端的内容,会在异步回调时传回来"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment">//===============================ACL操作======================================</span>

<span class="token comment">/**
 * ACL操作只给 同步  ,异步 自己看文档
 */</span>


<span class="token comment">/**
 * 每一步操作/node3都要先执行该语句
 * 因为上一步创建的node3 添加了 digest ACL 所以在获取该节点信息的时候,要先添加授权
 */</span>



<span class="token comment">/**
 * 设置ACL
 */</span>
<span class="token comment">//先注册一个 helloworld 密码为123456的用户</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">addAuthInfo</span><span class="token punctuation">(</span><span class="token string">"digest"</span><span class="token punctuation">,</span><span class="token string">"helloworld:123456"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//因为是 /node3 节点 所以还需要 先添加 /node3的授权</span>
zookeeper1<span class="token punctuation">.</span><span class="token function">addAuthInfo</span><span class="token punctuation">(</span><span class="token string">"digest"</span><span class="token punctuation">,</span><span class="token string">"wangsaichao:123456"</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Stat auth <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">setACL</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span> Collections<span class="token punctuation">.</span><span class="token function">singletonList</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ACL</span><span class="token punctuation">(</span>ZooDefs<span class="token punctuation">.</span>Perms<span class="token punctuation">.</span>ALL<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Id</span><span class="token punctuation">(</span><span class="token string">"auth"</span><span class="token punctuation">,</span> <span class="token string">"helloworld:123456"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>auth<span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment">/**
 * 获取ACL
 */</span>
List<span class="token generics function"><span class="token punctuation">&lt;</span>ACL<span class="token punctuation">&gt;</span></span> acl <span class="token operator">=</span> zookeeper1<span class="token punctuation">.</span><span class="token function">getACL</span><span class="token punctuation">(</span><span class="token string">"/node3"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Stat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>acl<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

@Override
public void process(WatchedEvent event) {
System.out.println(“Receive watched event:” + event);
if(event.getState() == KeeperState.SyncConnected){
System.out.println("zookeeper state is " + KeeperState.SyncConnected);
}
}
}

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值