天天看点

Zookeeper(七):zookeeper常用API+demo

一、简介

ZooKeeper是一个分布式协调服务 API共包含五个包,分别为:

  (1)org.apache.zookeeper

  (2)org.apache.zookeeper.data

  (3)org.apache.zookeeper.server

  (4)org.apache.zookeeper.server.quorum

  (5)org.apache.zookeeper.server.upgrade

其中org.apache.zookeeper,包含Zookeeper类,他是我们编程时最常用的类文件。这个类是Zookeeper客户端的主要类文件。如果要使用Zookeeper服务,应用程序首先必须创建一个Zookeeper实例,这时就需要使用此类。一旦客户端和Zookeeper服务建立起了连接,Zookeeper系统将会给次连接会话分配一个ID值,并且客户端将会周期性的向服务器端发送心跳来维持会话连接。只要连接有效,客户端就可以使用Zookeeper API来做相应处理了。

Zookeeper类提供了如下图所示的几类主要方法

 ZK的主要特性:

  •  客户端如果对ZK的一个数据节点注册一个Watcher监听,那么当该数据节点的内容或子节点列表发生变更时zk服务器都会向所有订阅客户端发送变更通知
  • 对于在ZK上创建的临时节点,一旦客户端与服务器见的会话失败,那么该临时节点也会自动清除
  • ZK将会保证客户端无法重复创建一个已经存在的数据节点

基于zk的这两个特性可以解决很多分布式问题。

ZK作为一个分布式服务框架,主要用来解决分布式数据一致性问题,它提供了简单分布式元语,并且对多种语言提供了API,下面是介绍JAVA客户端API的使用。

     ZK提供的API接口一般有一个同步接口一个异步接口,使用方法基本相同。

  • 客户端可以通过创建一个org.apache.zookeeper.ZooKeeper的实例来连接服务器。主要的构造方法有:

       ZooKeeper(String connectString,int sessionTimeout,Watcher watcher)

       ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,boolean canReadOnly)

       ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd)

      ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd,boolean canReadOnly)

      connectString:值ZK服务器列表,如localhost:2181,127.0.0.1:2181

      sessionTimeout:指会话超时时间,以毫秒为单位的整数值;在一个会话周期内,zk客户端和服务器会通过心跳维持会话的有效性,在sessionTimeout时间内,如果连接断开,zk客户端会主动和服务器建立连接

     watcher:Watcher事件通知处理器

    canReadOnly:这是一个boolean值,用于标识当前会话是否支持“read-only”模式。默认情况下,在ZK集群中,一个机器如果和集群中的半数以及半数以上的机器失去连接,那么这个机器将不再处理客户端请求(读请求+写请求均不处理);但是有时候我们希望在发生此类故障时不影响读取请求的处理,这个就是zk的read-only 模式

    sessionId和sessionPasswd,分别代表会话Id和会话密钥。这连个参数可以唯一确定一个会话。

  • 创建节点常用的接口是:

      String create(final String path,byte[] data,List<ACL>acl,CreateModel createModel);

      String create(final String path,byte[] data,List<ACL> acl,CreateModel,StringCallback cb,Object ctx);

       如果节点已经存在则抛出一个NodeExistsException异常

回调接口

   StringCallback{

   public void (int rc,String path,Object ctx,String name)

}

    rc是result code 服务端响应结果码。客户端可以从这个结果码中识别出API的调用结果,常见的结果码有:

      0(OK),接口调用成功

      -4(ConnectionLoss),客户端和服务器连接断开

     -110(NodeExists) 节点已存在

    -112(SessionExpired)会话已过期

   path: 接口调用传入的数据节点的节点路径

   ctx: 接口调用传入的ctx参数

  name: 实际在服务器端创建的节点名

  • 删除节点常用的接口:

       void delete(final String path,int version);

       void delete(final String path,int version,VoidCallback cb,Object ctx);

     如果删除的节点不存在则会抛出一个NoNodeException,如果删除数据的版本号不正确则抛出一个BadVersionException

  • 获取子节点列表的接口:

     List<String> getChildren(final String path,Watcher watcher);

     List<String> getChildren(final String path,boolean watcher);

     void  getChildren(final String path,Watcher watcher,ChildrenCallback cb,Object ctx);

     void  getChildren(final String path,boolean watcher,ChildrenCallback cb,Object ctx);

     List<String> getChildren(final String path,Watcher watcher,Stat stat);

     List<String> getChildren(final String path,boolean watcher,Stat stat);

     void getChildren(final String path,Watcher watcher,Stat stat,ChildrenCallback cb,Object ctx);

     void getChildren(final String path,boolean watcher,Stat stat,ChildrenCallback cb,Object ctx);

  • 获取节点数据的接口

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

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

   void getData(final String path,Watcher watcher,Stat stat,DataCallback cb,Object ctx);

   void getData(final String path,boolean watcher,Stat stat,DataCallback cb,Object ctx);

  • 更新数据的接口

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

    void setData(final String path,byte[] data,int version,StatCallback cb,Object ctx);

   如果数据的版本不一致则抛出一个BadVersionExcepion

    zk的数据版本是从0开始计数的。如果客户端传入的是-1,则表示zk服务器需要基于最新的数据进行更新。如果对zk的数据节点的更新操作没有原子性要求则可以使用-1.

  • 检测节点是否存在的接口

      Stat exists(final String path,Watcher watcher);

      Stat exists(final String path,boolean watcher);

     void exists(final String path, Watcher watcher,StatCallback cb,Object ctx);

     void exists(final String path,boolean watcher,StatCallback cb,Object ctx);

  • version 说明

      version参数用于指定节点数据的版本,表明本次更新操作是针对指定数据版本进行的。这是ZK对 CAS(Compare and Swap)的实现,只有数据的版本和预期的版本一致时才会更新数据,这样可以有效避免分布式环境下并发更新的问题。如果多个客户端并发更新,则只有一个可 以更新成功,其他的因为版本不一致则不会更新数据。zk中version和传统意义上的软件版本概念上有很大的不同,在ZK中,version表示的是对 节点数据内容,子节点列表或是ACL信息修改的次数。在一个节点数据创建完毕后,其viersion=0,表示当前节点数据自创建以后被修改0次,修改一 次版本的值增加1;使用-1表示使用基于最新版本进行修改,即每次都会执行更新!version强调的是变更次数,即使前后两次变更的内容的值没有发生变化,version的值依然会变更。

   在创建zk的客户端时在构造方法中默认设置一个Watcher,这个Watcher作为zk会话期间的默认watcher.同时zk也可以通过 getData, getChildren,exist三个接口向zk注册watcher.

Watcher是通知的处理器,WatchedEvent的属性有 KeeperState ,EventType

* Licensed to the Apache Software Foundation (ASF) under one
package org.apache.zookeeper;

import org.apache.zookeeper.proto.WatcherEvent;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;

/**
 *  A WatchedEvent represents a change on the ZooKeeper that a Watcher
 *  is able to respond to.  The WatchedEvent includes exactly what happened,
 *  the current state of the ZooKeeper, and the path of the znode that
 *  was involved in the event.
 */
public class WatchedEvent {
    final private KeeperState keeperState;
    final private EventType eventType;
    private String path;
    
    /**
     * Create a WatchedEvent with specified type, state and path
     */
    public WatchedEvent(EventType eventType, KeeperState keeperState, String path) {
        this.keeperState = keeperState;
        this.eventType = eventType;
        this.path = path;
    }
    
    /**
     * Convert a WatcherEvent sent over the wire into a full-fledged WatcherEvent
     */
    public WatchedEvent(WatcherEvent eventMessage) {
        keeperState = KeeperState.fromInt(eventMessage.getState());
        eventType = EventType.fromInt(eventMessage.getType());
        path = eventMessage.getPath();
    }
    
    public KeeperState getState() {
        return keeperState;
    }
    
    public EventType getType() {
        return eventType;
    }
    
    public String getPath() {
        return path;
    }

    @Override
    public String toString() {
        return "WatchedEvent state:" + keeperState
            + " type:" + eventType + " path:" + path;
    }

    /**
     *  Convert WatchedEvent to type that can be sent over network
     */
    public WatcherEvent getWrapper() {
        return new WatcherEvent(eventType.getIntValue(), 
                                keeperState.getIntValue(), 
                                path);
    }
}
           

 WatchedEvent的KeeperStat和EventType对应关系

KeeperState EventType 触发条件 备注
SyncConnected None 客户端与服务器成功建立会话 会话是连接状态
NodeCreated Watcher监听的节点创建成功
NodeDeleted Watcher监听的节点被删除
NodeDataChanged Watcher监听的节点数据内容发生变更
NodeChildrenChanged Watcher监听的节点子列表发生变更
Disconnected None 客户端与服务器断开连接
Expired None 会话超时
AuthFailed None
  •  Watcher特性说明

      一次性

           一旦watcher被触发,ZK都会从相应的存储中移除。因此在使用Watcher时需要谨记使用前一定要注册

     客户端串行执行

        客户端Watcher回调的过程是一个串行同步的过程,这是为了保证顺序。同时需要谨记千万不要因为一个Watcher的处理逻辑影响了整个客户端的Watcher回调

     轻量

        WatchedEvent是ZK整个Watcher通知机制的最小通知单元。从上文已经介绍了这个数据结构中只包含三部分:通知状态,事件类型,节点路径。也就是说,Watcher通知仅仅告诉客户端发生了什么事情,而不会说明事件的具体内容。

package com.vrv.linkdood_zookeeper;

import java.util.Date;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.apache.zookeeper.AsyncCallback.DataCallback;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.AsyncCallback.StringCallback;
import org.apache.zookeeper.AsyncCallback.VoidCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

/**
 * 	 <B>说	明<B/>:
 * 
 * @author 作者名:冯龙淼
 * 		   E-mail:[email protected]
 * 
 * @version 版   本  号:1.0.<br/>
 *          创建时间:2018年2月8日 下午2:17:48
 */
public class ZKDemo {  
	  
    private static ZooKeeper authZK = null;  
  
    private static String path = "/service";  
  
    /** 
     * 
     * @param args 
     * @throws Exception 
     */  
    public static void main(String[] args) throws Exception {  
        sync();  
        TimeUnit.SECONDS.sleep(10);  
        createZKWithSessionIdAndSessionPasswd();  
        authCreate();  
    }  
  
    /** 
     * 指定权限 
     * 
     * @throws Exception 
     */  
    private static void authCreate() throws Exception {  
        final CountDownLatch latch = new CountDownLatch(1);  
        authZK = new ZooKeeper("192.168.133.149:2180", 5000, new Watcher() {  
  
            public void process(WatchedEvent event) {  
                System.out.println("监听器,监听到的事件时:" + event);  
                if (KeeperState.SyncConnected == event.getState()) {  
                    //如果客户端已经建立连接闭锁减一  
                    System.out.println("建立连接");  
                    latch.countDown();  
                }  
            }  
        });  
        // 等待连接建立  
        latch.await();  
        // 增加权限  
        authZK.addAuthInfo("digest", "foo:true".getBytes());  
        // 判断path 是否已经存在  
        if (authZK.exists(path, true) == null) {  
            authZK.create(path, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);  
        }  
        String str = authZK.create(path + "/auth", "test".getBytes(), Ids.CREATOR_ALL_ACL,  
            CreateMode.EPHEMERAL);  
        System.out.println(str);  
  
    }  
  
    private static void createZKWithSessionIdAndSessionPasswd() throws Exception {  
        // 初始化一个闭锁  
        final CountDownLatch latch = new CountDownLatch(1);  
  
        /** 
         * 创建一个ZooKeeper对象,192.168.133.149:2180是zk服务器的主机名和端口号 
         *  50000  sessionTimeout session超时时间 
         *  Watcher 默认的WatchedEvent事件处理器 
         */  
        ZooKeeper originalZk = new ZooKeeper("192.168.133.149:2180", 50000, new Watcher() {  
  
            public void process(WatchedEvent event) {  
                /** 
                 * 如果zk客户端和服务器已经建立连接,闭锁减一 
                 */  
                if (KeeperState.SyncConnected == event.getState()) {  
                    latch.countDown();  
                }  
            }  
        });  
        // 等待闭锁为0,即一直等待zk客户端和服务器建立连接  
        latch.await();  
  
        // 通过sessionId,和sessionPasswd创建一个复用的ZK客户端  
        ZooKeeper zkCopy = new ZooKeeper(path, 50000, new Watcher() {  
  
            public void process(WatchedEvent event) {  
  
            }  
        }, originalZk.getSessionId(), originalZk.getSessionPasswd());  
  
        System.out.println("复用zk" + zkCopy + " original zk=" + originalZk);  
  
    }  
  
    /** 
     * 
     * 
     * @return 
     * @throws Exception 
     */  
    private static ZooKeeper sync() throws Exception {  
        // 初始化一个闭锁  
        final CountDownLatch latch = new CountDownLatch(1);  
  
        /** 
         * 创建一个ZooKeeper对象,localhost:2181是zk服务器的主机名和端口号 
         *  50000  sessionTimeout session超时时间 
         *  Watcher 默认的WatchedEvent事件处理器 
         */  
        ZooKeeper zk = new ZooKeeper("192.168.133.149:2180", 50000, new Watcher() {  
  
            public void process(WatchedEvent event) {  
                System.out.println("默认监听器,KeeperStat:" + event.getState() + ", EventType:"  
                                   + event.getType() + ", path:" + event.getPath());  
                /** 
                 * 如果zk客户端和服务器已经建立连接,闭锁减一 
                 */  
                if (KeeperState.SyncConnected == event.getState()) {  
                    latch.countDown();  
                }  
            }  
        });  
        // 等待闭锁为0,即一直等待zk客户端和服务器建立连接  
        latch.await();  
  
        zk.getData(path, true, new DataCallback() {  
  
            public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {  
                System.out.println("rc=" + rc + ",path=" + path + " data=" + data + " Stat=" + stat  
                                   + ", data=" + (data == null ? "null" : new String(data)));  
            }  
        }, null);  
  
        // 创建一个临时节点,非安全的权限
        zk.create(path + "/temporary", "CEMS".getBytes(), Ids.OPEN_ACL_UNSAFE,  
        	//CreateMode.EPHEMERAL
            CreateMode.EPHEMERAL, new StringCallback() {  
  
                public void processResult(int rc, String path, Object ctx, String name) {  
                    if (rc == 0) {  
                        System.out.println("create a temporary node successed in path:"+path);  
                    }  
                }  
            }, null);  
  
        // 更新path节点数据  
        zk.setData(path, String.valueOf(new Date().getTime()).getBytes(), -1, new StatCallback() {  
  
            public void processResult(int rc, String path, Object ctx, Stat stat) {  
                if (rc == 0) {  
                    System.out.println("成功更新节点数据, rc=0, path=" + path + ", stat=" + stat);  
                }  
            }  
        }, null);  
  
        /** 
         * 如果该节点不存在则创建持久化的节点 
         * ZK的节点有三位,持久化节点(PERSISTENT),临时节点(EPHEMERAL),顺序节点(SEQUENTIAL) 
         * 具体的组合有 /** 
 
        PERSISTENT, 
        //持久化序列节点 
        PERSISTENT_SEQUENTIAL, 
 
        EPHEMERAL , 
        //临时序列节点 
        EPHEMERAL_SEQUENTIAL 
         * 
         */  
        // 创建一个持久化非安全权限的节点,如果该节点已经存在则不需要再次创建  
        if (zk.exists(path, true) == null) {  
            zk.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
        }  
        // 删除持久化序列节点  
        try {  
            zk.delete(path + "/seq ", 1, new VoidCallback() {  
  
                public void processResult(int rc, String path, Object ctx) {  
                    System.out.println("删除" + ZKDemo.path + "/seq 的结果是:rc=" + rc + " path=" + path  
                                       + ",context=" + ctx);  
                }  
            }, null);  
        } catch (Exception e) {  
            // 示例代码创建新的持久节点前,如果以前存在则删除,如果不存在则或抛出一个NoNodeException  
        }  
        // 创建一个持久化序列节点  
        String seqPath = zk  
            .create(path + "/seq ", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
        //读取子节点列表,并注册一个监听器  
        zk.getChildren(path, new Watcher() {  
  
            public void process(WatchedEvent event) {  
                System.out.println(event);  
            }  
        });  
        //更新节点数据  
        zk.setData(seqPath, "seqDemo".getBytes(), -1);  
  
        //创建临时节点  
        zk.create(path + "/test", "test".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);  
        // 删除节点  
        zk.delete(path + "/test", 0);  
  
        // 异步创建临时序列节点  
        zk.create(path + "/test", "123".getBytes(), Ids.OPEN_ACL_UNSAFE,  
            CreateMode.EPHEMERAL_SEQUENTIAL, new StringCallback() {  
  
                public void processResult(int rc, String path, Object ctx, String name) {  
                    System.out.println("创建临时节点的结果是:result code=" + rc + ", path=" + path  
                                       + " context=" + ctx + ", name=" + name);  
                }  
            }, "Test Context");  
  
        TimeUnit.SECONDS.sleep(5);  
  
        // 更新数据  
        if (zk.exists(path + "/test", true) != null) {  
            zk.setData(path + "/test", "testData".getBytes(), -1);  
        }  
        zk.create(path + "/test2", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);  
        // 使用默认监听器,获取子节点  
        List<String> znodes = zk.getChildren(path, true);  
        // 获取所有节点下的数据  
        Stat stat = new Stat();  
        for (String str : znodes) {  
            byte[] data = zk.getData(path + "/" + str, true, stat);  
  
            System.out.println("获取节点:" + str + " 的数据是:"  
                               + (data == null ? "null" : new String(data)));  
        }  
        return zk;  
    }  
}  
           

结果:

[18/02/08 16:16:22:243][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
[18/02/08 16:16:22:246][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:host.name=PC-201707281439
[18/02/08 16:16:22:246][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.version=1.7.0_60
[18/02/08 16:16:22:246][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.vendor=Oracle Corporation
[18/02/08 16:16:22:250][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.home=D:\Develop\Java\jdk1.7.0_60\jre
[18/02/08 16:16:22:250][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.class.path=D:\workspace_2018\linkdood-disruptor\target\classes;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.6.2\log4j-api-2.6.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-core\2.6.2\log4j-core-2.6.2.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\3.2.17.RELEASE\spring-context-3.2.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\4.3.6.RELEASE\spring-aop-4.3.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\4.3.6.RELEASE\spring-beans-4.3.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\4.3.6.RELEASE\spring-core-4.3.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\4.3.6.RELEASE\spring-expression-4.3.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\3.2.17.RELEASE\spring-webmvc-3.2.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\4.3.6.RELEASE\spring-web-4.3.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\lmax\disruptor\3.3.6\disruptor-3.3.6.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\core\jersey-client\2.25.1\jersey-client-2.25.1.jar;C:\Users\Administrator\.m2\repository\javax\ws\rs\javax.ws.rs-api\2.0.1\javax.ws.rs-api-2.0.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\core\jersey-common\2.25.1\jersey-common-2.25.1.jar;C:\Users\Administrator\.m2\repository\javax\annotation\javax.annotation-api\1.2\javax.annotation-api-1.2.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\bundles\repackaged\jersey-guava\2.25.1\jersey-guava-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\hk2\osgi-resource-locator\1.0.1\osgi-resource-locator-1.0.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\hk2\hk2-api\2.5.0-b32\hk2-api-2.5.0-b32.jar;C:\Users\Administrator\.m2\repository\org\glassfish\hk2\hk2-utils\2.5.0-b32\hk2-utils-2.5.0-b32.jar;C:\Users\Administrator\.m2\repository\org\glassfish\hk2\external\aopalliance-repackaged\2.5.0-b32\aopalliance-repackaged-2.5.0-b32.jar;C:\Users\Administrator\.m2\repository\org\glassfish\hk2\external\javax.inject\2.5.0-b32\javax.inject-2.5.0-b32.jar;C:\Users\Administrator\.m2\repository\org\glassfish\hk2\hk2-locator\2.5.0-b32\hk2-locator-2.5.0-b32.jar;C:\Users\Administrator\.m2\repository\org\javassist\javassist\3.21.0-GA\javassist-3.21.0-GA.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet\2.25.1\jersey-container-servlet-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet-core\2.25.1\jersey-container-servlet-core-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\core\jersey-server\2.25.1\jersey-server-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\media\jersey-media-jaxb\2.25.1\jersey-media-jaxb-2.25.1.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\media\jersey-media-moxy\2.25.1\jersey-media-moxy-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\ext\jersey-entity-filtering\2.25.1\jersey-entity-filtering-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\eclipse\persistence\org.eclipse.persistence.moxy\2.6.0\org.eclipse.persistence.moxy-2.6.0.jar;C:\Users\Administrator\.m2\repository\org\eclipse\persistence\org.eclipse.persistence.core\2.6.0\org.eclipse.persistence.core-2.6.0.jar;C:\Users\Administrator\.m2\repository\org\eclipse\persistence\org.eclipse.persistence.asm\2.6.0\org.eclipse.persistence.asm-2.6.0.jar;C:\Users\Administrator\.m2\repository\org\glassfish\javax.json\1.0.4\javax.json-1.0.4.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jersey\media\jersey-media-multipart\2.25.1\jersey-media-multipart-2.25.1.jar;C:\Users\Administrator\.m2\repository\org\jvnet\mimepull\mimepull\1.9.6\mimepull-1.9.6.jar;C:\Users\Administrator\.m2\repository\javax\javaee-api\7.0\javaee-api-7.0.jar;C:\Users\Administrator\.m2\repository\com\sun\mail\javax.mail\1.5.6\javax.mail-1.5.6.jar;C:\Users\Administrator\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper\3.4.10\zookeeper-3.4.10.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.22\slf4j-api-1.7.22.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.22\slf4j-log4j12-1.7.22.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\Administrator\.m2\repository\jline\jline\0.9.94\jline-0.9.94.jar;C:\Users\Administrator\.m2\repository\io\netty\netty\3.10.5.Final\netty-3.10.5.Final.jar
[18/02/08 16:16:22:250][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.library.path=D:\Develop\Java\jdk1.7.0_60\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/Develop/Java/jdk1.7.0_60/bin/../jre/bin/server;D:/Develop/Java/jdk1.7.0_60/bin/../jre/bin;D:/Develop/Java/jdk1.7.0_60/bin/../jre/lib/amd64;C:\Program Files (x86)\Common Files\NetSarang;D:\Develop\apache-tomcat-7.0.54\bin;D:\Develop\maven\bin;D:\Develop\Java\jdk1.7.0_60\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Develop\SVN\bin;E:\Python\Scripts\;E:\Python\;D:\Develop\eclipse4.3_x86_64;;.
[18/02/08 16:16:22:250][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:java.compiler=<NA>
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:os.name=Windows 7
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:os.arch=amd64
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:os.version=6.1
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:user.name=Administrator
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:user.home=C:\Users\Administrator
[18/02/08 16:16:22:251][ INFO][org.apache.zookeeper.Environment.logEnv(Environment.java:100)] Client environment:user.dir=D:\workspace_2018\linkdood-disruptor
[18/02/08 16:16:22:253][ INFO][org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:438)] Initiating client connection, connectString=192.168.133.149:2180 sessionTimeout=50000 [email protected]
[18/02/08 16:16:22:289][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:1032)] Opening socket connection to server 192.168.133.149/192.168.133.149:2180. Will not attempt to authenticate using SASL (unknown error)
[18/02/08 16:16:22:291][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:876)] Socket connection established to 192.168.133.149/192.168.133.149:2180, initiating session
[18/02/08 16:16:22:309][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1299)] Session establishment complete on server 192.168.133.149/192.168.133.149:2180, sessionid = 0x16168f11c140020, negotiated timeout = 40000
默认监听器,KeeperStat:SyncConnected, EventType:None, path:null
rc=0,path=/service data=[[email protected] Stat=2,164,1517897261019,1518076701385,12,127,0,0,13,1,177
, data=1518077599635
create a temporary node successed in path:/service/temporary
默认监听器,KeeperStat:SyncConnected, EventType:NodeDataChanged, path:/service
成功更新节点数据, rc=0, path=/service, stat=2,180,1517897261019,1518076884179,13,128,0,0,13,2,179

删除/service/seq 的结果是:rc=0 path=/service/seq ,context=null
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/service
创建临时节点的结果是:result code=0, path=/service/test context=Test Context, name=/service/test0000000067
获取节点:seq  的数据是:seqDemo
获取节点:temporary 的数据是:CEMS
获取节点:test0000000067 的数据是:123
获取节点:test2 的数据是:123
[18/02/08 16:16:37:368][ INFO][org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:438)] Initiating client connection, connectString=192.168.133.149:2180 sessionTimeout=50000 [email protected]
[18/02/08 16:16:37:370][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:1032)] Opening socket connection to server 192.168.133.149/192.168.133.149:2180. Will not attempt to authenticate using SASL (unknown error)
[18/02/08 16:16:37:372][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:876)] Socket connection established to 192.168.133.149/192.168.133.149:2180, initiating session
[18/02/08 16:16:37:397][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1299)] Session establishment complete on server 192.168.133.149/192.168.133.149:2180, sessionid = 0x16168f11c140021, negotiated timeout = 40000
[18/02/08 16:16:37:400][ INFO][org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:575)] Initiating client connection, connectString=/service sessionTimeout=50000 [email protected] sessionId=16168f11c140021 sessionPasswd=<hidden>
复用zkState:CONNECTING sessionid:0x16168f11c140021 local:null remoteserver:null lastZxid:0 xid:1 sent:0 recv:0 queuedpkts:0 pendingresp:0 queuedevents:0 original zk=State:CONNECTED Timeout:40000 sessionid:0x16168f11c140021 local:/192.168.133.72:54662 remoteserver:192.168.133.149/192.168.133.149:2180 lastZxid:0 xid:1 sent:1 recv:1 queuedpkts:0 pendingresp:0 queuedevents:0
[18/02/08 16:16:37:408][ INFO][org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:438)] Initiating client connection, connectString=192.168.133.149:2180 sessionTimeout=5000 [email protected]
[18/02/08 16:16:37:409][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:1032)] Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
[18/02/08 16:16:37:411][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:1032)] Opening socket connection to server 192.168.133.149/192.168.133.149:2180. Will not attempt to authenticate using SASL (unknown error)
[18/02/08 16:16:37:413][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:876)] Socket connection established to 192.168.133.149/192.168.133.149:2180, initiating session
[18/02/08 16:16:37:416][ INFO][org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1299)] Session establishment complete on server 192.168.133.149/192.168.133.149:2180, sessionid = 0x16168f11c140022, negotiated timeout = 5000
监听器,监听到的事件时:WatchedEvent state:SyncConnected type:None path:null
建立连接
默认监听器,KeeperStat:SyncConnected, EventType:NodeChildrenChanged, path:/service
/service/auth
           

继续阅读