zookeeper个人基础教程(五)java操作篇之watcher监听

回顾下watcher

ZooKeeper中的所有读取操作 - getData(),getChildren()和exists() - 都可以选择将监听设置到该方法作为回调异步运算。这是ZooKeeper对watch的定义:watch事件是一次性触发,发送到设置watch的客户端,当watch设置的数据发生变化时会发生这种情况。在这个watch定义中需要考虑三个要点:

  • 一次性触发器 当数据发生变化时,将向客户端发送一个监视事件。例如,如果客户端执行getData(“/ znode1”,true),稍后更改或删除/ znode1的数据,则客户端将获得/ znode1的监视事件。如果/ znode1再次更改,则除非客户端已执行另一次设置新监视的读取,否则不会发送监视事件。
  • 发送到客户端 这意味着事件正在到达客户端的路上,但在更改操作的成功返回代码到达发起更改的客户端之前可能无法到达客户端。watch以异步方式发送给观察者。ZooKeeper提供了一个订购保证:客户端在第一次看到监视事件之前,永远不会看到设置监视的更改。网络延迟或其他因素可能导致不同的客户端在不同时间看到更新的watch和返回代码。关键点在于,不同客户看到的所有内容都会有一致的顺序。
  • watch设置的数据 这指的是节点可以改变的不同方式。将ZooKeeper视为维护两个watch列表是有帮助的:数据watch和子节点手watch。getData()和exists()设置数据监视。getChildren()设置子监视。或者,可以根据返回的数据类型来考虑设置watch。getData()和exists()返回有关节点数据的信息,而getChildren()返回子节点列表。因此,setData()将触发正在设置的znode的数据监视(假设该集成功)。成功的create()将触发正在创建的znode的数据监视和子监视父znode。成功的delete()将触发数据监视和子监视(因为没有更多子项),因为要删除的znode以及父znode的子监视。

watch在本地维护客户端所连接的ZooKeeper服务器。这使得watch可以轻量化以进行设置,维护和调度。当客户端连接到新服务器时,将针对任何会话事件触发监视。从服务器断开连接时不会收到watch。当客户重新连接时,任何以前注册的watch将被重新注册并在需要时触发。一般来说,这一切都是透明的。有一种情况可能会遗漏手表:如果在断开连接时创建并删除了znode,则会遗漏watch中是否存在尚未创建的znode。
(以上是机翻的,参考地址:https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html)

watch 有以下几个特点
  • 一次性,watch事件只会在调用时发生,不保持监听,意味着只有触发watch事件时监听;
  • 注册watch事件首先需要继承Watch类,并重写其中的process方法,为该事件的回调方法;
  • process返回了一个WatchEvent对象,可以返回监听的内容,如:
    zookeeper的连接状态:连接,超时等;
    事件类型:节点创建,节点数据改变,子节点改变,以及无改变等等;监听的节点路径;

注意 watch是异步回调时间,如果要做同步操作,需要加上countdownlatch 对主线程进行阻塞等待watch异步函数countdown(完成)之后再来继续运行主线程之后的操作确保同步。

我们可以使用读取ZooKeeper状态的三个调用来设置监视:exists,getData和getChildren。以下列表详细说明了手表可以触发的事件以及启用它们的调用:

  • 创建的事件: 通过调用exists启用。
  • 已删除事件: 通过调用exists,getData和getChildren启用。
  • 更改事件: 通过调用exists和getData启用。
  • 子事件: 通过调用getChildren启用。
zookeeper构造函数添加watcher异步监视
package com.skindow.zookeeper;

import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by Administrator on 2019/8/6.
 */
@Slf4j
public class ZkWatchTest {
    private static CountDownLatch cound = new CountDownLatch(1);
    private static volatile Boolean flag = true;
    private String connect;
    private int sessionTimeout;
    private ZooKeeper zk;
    public ZooKeeper getZookeeper() throws InterruptedException {
        final ZooKeeper[] zk = {null};
        new Thread(() -> {
            try {
                zk[0] = new ZooKeeper(connect, sessionTimeout, new Watcher() {
                    @Override
                    public void process(WatchedEvent watchedEvent) {
                        log.info("watchedEvent.getPath(); => "+ watchedEvent.getPath());
                        log.info("watchedEvent.getState(); => "+  watchedEvent.getState());
                        log.info("watchedEvent.getType() =>" + watchedEvent.getType());
                    }
                });
                while (flag)
                {
                    System.out.println(zk[0].getState() + ".....");
                    Thread.sleep(1000);
                    if (zk[0].getState().equals(ZooKeeper.States.CONNECTING))
                    {
                        log.info("正在连接中。。。");
                    }
                    if (zk[0].getState().equals(ZooKeeper.States.CONNECTED))
                    {
                        log.info("连接成功!");
                        flag = false;
                        cound.countDown();
                    }
                }
            } catch (IOException e) {
                log.error("连接出错:",e);
            } catch (InterruptedException e) {
                log.error("线程错误:",e);
            }
        }).start();
        cound.await();
        return zk[0];
    }
    public ZkWatchTest(String connect, int sessionTimeout) throws InterruptedException {
        this.connect = connect;
        this.sessionTimeout = sessionTimeout;
        zk = getZookeeper();
    }
}

测试结果如下

"C:\Program Files\Java\jdk1.8.0_131\bin\java" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar=59071:D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\java_project\myfirstSpringboot\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.1.6.RELEASE\spring-boot-starter-data-jpa-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.1.6.RELEASE\spring-boot-starter-aop-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.1.8.RELEASE\spring-aop-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar;C:\Users\Administrator\.m2\repository\javax\transaction\javax.transaction-api\1.3\javax.transaction-api-1.3.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\Administrator\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Administrator\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\Administrator\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\Administrator\.m2\repository\net\bytebuddy\byte-buddy\1.9.13\byte-buddy-1.9.13.jar;C:\Users\Administrator\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\Administrator\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\Administrator\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-jpa\2.1.9.RELEASE\spring-data-jpa-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-commons\2.1.9.RELEASE\spring-data-commons-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-orm\5.1.8.RELEASE\spring-orm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-tx\5.1.8.RELEASE\spring-tx-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.1.8.RELEASE\spring-beans-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aspects\5.1.8.RELEASE\spring-aspects-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.1.6.RELEASE\spring-boot-starter-jdbc-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.1.6.RELEASE\spring-boot-starter-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.1.6.RELEASE\spring-boot-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.1.6.RELEASE\spring-boot-autoconfigure-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.1.6.RELEASE\spring-boot-starter-logging-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;C:\Users\Administrator\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;C:\Users\Administrator\.m2\repository\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jdbc\5.1.8.RELEASE\spring-jdbc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.1.6.RELEASE\spring-boot-starter-web-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.1.6.RELEASE\spring-boot-starter-json-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.1.6.RELEASE\spring-boot-starter-tomcat-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.21\tomcat-embed-core-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.21\tomcat-embed-el-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.21\tomcat-embed-websocket-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\5.1.8.RELEASE\spring-web-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\5.1.8.RELEASE\spring-webmvc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.1.8.RELEASE\spring-expression-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web-services\2.1.6.RELEASE\spring-boot-starter-web-services-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\sun\xml\messaging\saaj\saaj-impl\1.5.0\saaj-impl-1.5.0.jar;C:\Users\Administrator\.m2\repository\javax\xml\soap\javax.xml.soap-api\1.4.0\javax.xml.soap-api-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\jvnet\mimepull\mimepull\1.9.11\mimepull-1.9.11.jar;C:\Users\Administrator\.m2\repository\org\jvnet\staxex\stax-ex\1.8\stax-ex-1.8.jar;C:\Users\Administrator\.m2\repository\javax\xml\ws\jaxws-api\2.3.1\jaxws-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-oxm\5.1.8.RELEASE\spring-oxm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-ws-core\3.0.7.RELEASE\spring-ws-core-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-xml\3.0.7.RELEASE\spring-xml-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-jdbc\2.1.7.RELEASE\spring-session-jdbc-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-core\2.1.7.RELEASE\spring-session-core-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.1.8.RELEASE\spring-context-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.16\mysql-connector-java-8.0.16.jar;C:\Users\Administrator\.m2\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper\3.5.5\zookeeper-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper-jute\3.5.5\zookeeper-jute-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;C:\Users\Administrator\.m2\repository\io\netty\netty-all\4.1.36.Final\netty-all-4.1.36.Final.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar" com.skindow.zookeeper.ZooUtilTest
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
10:27:28.146 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.5.5-390fe37ea45dee01bf87dc1c042b5e3dcce88653, built on 05/03/2019 12:07 GMT
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=CL-20026.clps.com.cn
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.8.0_131
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=C:\Program Files\Java\jdk1.8.0_131\jre
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\java_project\myfirstSpringboot\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.1.6.RELEASE\spring-boot-starter-data-jpa-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.1.6.RELEASE\spring-boot-starter-aop-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.1.8.RELEASE\spring-aop-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar;C:\Users\Administrator\.m2\repository\javax\transaction\javax.transaction-api\1.3\javax.transaction-api-1.3.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\Administrator\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Administrator\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\Administrator\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\Administrator\.m2\repository\net\bytebuddy\byte-buddy\1.9.13\byte-buddy-1.9.13.jar;C:\Users\Administrator\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\Administrator\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\Administrator\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-jpa\2.1.9.RELEASE\spring-data-jpa-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-commons\2.1.9.RELEASE\spring-data-commons-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-orm\5.1.8.RELEASE\spring-orm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-tx\5.1.8.RELEASE\spring-tx-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.1.8.RELEASE\spring-beans-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aspects\5.1.8.RELEASE\spring-aspects-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.1.6.RELEASE\spring-boot-starter-jdbc-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.1.6.RELEASE\spring-boot-starter-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.1.6.RELEASE\spring-boot-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.1.6.RELEASE\spring-boot-autoconfigure-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.1.6.RELEASE\spring-boot-starter-logging-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;C:\Users\Administrator\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;C:\Users\Administrator\.m2\repository\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jdbc\5.1.8.RELEASE\spring-jdbc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.1.6.RELEASE\spring-boot-starter-web-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.1.6.RELEASE\spring-boot-starter-json-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.1.6.RELEASE\spring-boot-starter-tomcat-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.21\tomcat-embed-core-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.21\tomcat-embed-el-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.21\tomcat-embed-websocket-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\5.1.8.RELEASE\spring-web-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\5.1.8.RELEASE\spring-webmvc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.1.8.RELEASE\spring-expression-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web-services\2.1.6.RELEASE\spring-boot-starter-web-services-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\sun\xml\messaging\saaj\saaj-impl\1.5.0\saaj-impl-1.5.0.jar;C:\Users\Administrator\.m2\repository\javax\xml\soap\javax.xml.soap-api\1.4.0\javax.xml.soap-api-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\jvnet\mimepull\mimepull\1.9.11\mimepull-1.9.11.jar;C:\Users\Administrator\.m2\repository\org\jvnet\staxex\stax-ex\1.8\stax-ex-1.8.jar;C:\Users\Administrator\.m2\repository\javax\xml\ws\jaxws-api\2.3.1\jaxws-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-oxm\5.1.8.RELEASE\spring-oxm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-ws-core\3.0.7.RELEASE\spring-ws-core-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-xml\3.0.7.RELEASE\spring-xml-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-jdbc\2.1.7.RELEASE\spring-session-jdbc-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-core\2.1.7.RELEASE\spring-session-core-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.1.8.RELEASE\spring-context-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.16\mysql-connector-java-8.0.16.jar;C:\Users\Administrator\.m2\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper\3.5.5\zookeeper-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper-jute\3.5.5\zookeeper-jute-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;C:\Users\Administrator\.m2\repository\io\netty\netty-all\4.1.36.Final\netty-all-4.1.36.Final.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\VanDyke Software\Clients\;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.8.0_131\bin;D:\Program Files\apache-tomcat-7.0.68\lib;D:\Program Files\apache-tomcat-7.0.68\bin;C:\Program Files\MySQL\MySQL Server 5.5\bin;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;%MAVEN_HOME%\bin;D:\Program Files\Git\cmd;.
10:27:28.153 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA>
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 7
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=6.1
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=Administrator
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:\Users\Administrator
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=D:\java_project\myfirstSpringboot
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.free=110MB
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.max=1796MB
10:27:28.154 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.total=123MB
10:27:28.191 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=2000 watcher=com.skindow.zookeeper.ZkWatchTest$1@2f6dce0
10:27:28.203 [Thread-0] INFO org.apache.zookeeper.common.X509Util - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
10:27:28.543 [Thread-0] INFO org.apache.zookeeper.ClientCnxnSocket - jute.maxbuffer value is 4194304 Bytes
10:27:28.559 [Thread-0] INFO org.apache.zookeeper.ClientCnxn - zookeeper.request.timeout value is 0. feature enabled=
CONNECTING.....
10:27:28.565 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.SaslServerPrincipal - Canonicalized address to 127.0.0.1
10:27:28.569 [Thread-0-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
10:27:28.572 [Thread-0-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established, initiating session, client: /127.0.0.1:59077, server: 127.0.0.1/127.0.0.1:2181
10:27:28.576 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
10:27:28.621 [Thread-0-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x1005cdf7eeb0017, negotiated timeout = 4000
10:27:28.630 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - watchedEvent.getPath(); => null
10:27:28.630 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - watchedEvent.getState(); => SyncConnected
10:27:28.630 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - watchedEvent.getType(); =>None
10:27:29.572 [Thread-0] INFO com.skindow.zookeeper.ZkWatchTest - 连接成功!

Process finished with exit code 0


我们看到watchedEvent.getState() 为SyncConnected 对应Watcher.Event.KeeperState 中以下几个状态 说明当前处于连接中

  • AuthFailed
    Auth失败状态
  • ConnectedReadOnly
    客户端连接到只读服务器,即当前未连接到大多数服务器的服务器。
  • Disconnected
    客户端处于断开连接状态 - 它未连接到整体中的任何服务器。
  • Expired
    服务群集已过期此会话。
  • NoSyncConnected
    已过时。
  • SaslAuthenticated
    SaslAuthenticated:用于通知客户端他们已经过SASL身份验证,以便他们可以使用SASL授权的权限执行Zookeeper操作。
  • SyncConnected
    客户端处于连接状态 - 它连接到集合中的服务器(在ZooKeeper客户端创建期间在主机连接参数中指定的服务器之一)。
  • Unknown
    已过时。

watcher里面的相关事件

 

event For "/path"

event For "/path/child"

create("/path")

EventType.NodeCreated

NA

delete("/path")

EventType.NodeDeleted

NA

setData("/path")

EventType.NodeDataChanged

NA

create("/path/child")

EventType.NodeChildrenChanged

EventType.NodeCreated

delete("/path/child")

EventType.NodeChildrenChanged

EventType.NodeDeleted

setData("/path/child")

NA

EventType.NodeDataChanged

操作与watcher关系

"/path"

"/path/child"

 

exists

getData

getChildren

exists

getData

getChildren

create("/path")

    

delete("/path")

   

setData("/path")

    

create("/path/child")

  

 

delete("/path/child")

  

setData("/path/child")

   

 

总结
EventType 是对节点的改变的监听
KeeperState 是对数据的改变的监听

探讨试验增删改查,相应的操作会被那个方法(exitis,getData,getChildren)的watcher接收,响应何种状态码
  1. ZkWatchTest 类用于注册watcher和对znode的增删改查
package com.skindow.zookeeper;

import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

import static org.aspectj.weaver.tools.cache.SimpleCacheFactory.path;

/**
 * Created by Administrator on 2019/8/6.
 */
@Slf4j
public class ZkWatchTest {
    private static CountDownLatch cound = new CountDownLatch(1);
    private static volatile Boolean flag = true;
    private String connect;
    private int sessionTimeout;
    private ZooKeeper zk;
    public ZooKeeper getZookeeper() throws InterruptedException {
        final ZooKeeper[] zk = {null};
        new Thread(() -> {
            try {
                zk[0] = new ZooKeeper(connect, sessionTimeout, new Watcher() {
                    @Override
                    public void process(WatchedEvent watchedEvent) {
                        log.info("watchedEvent.getPath(); => "+ watchedEvent.getPath());
                        log.info("watchedEvent.getState(); => "+  watchedEvent.getState());
                        log.info("watchedEvent.getType(); =>" + watchedEvent.getType());
                    }
                });
                while (flag)
                {
                    System.out.println(zk[0].getState() + ".....");
                    Thread.sleep(1000);
                    if (zk[0].getState().equals(ZooKeeper.States.CONNECTING))
                    {
                        log.info("正在连接中。。。");
                    }
                    if (zk[0].getState().equals(ZooKeeper.States.CONNECTED))
                    {
                        log.info("连接成功!");
                        flag = false;
                        cound.countDown();
                    }
                }
            } catch (IOException e) {
                log.error("连接出错:",e);
            } catch (InterruptedException e) {
                log.error("线程错误:",e);
            }
        }).start();
        cound.await();
        return zk[0];
    }
    public ZkWatchTest(String connect, int sessionTimeout) throws InterruptedException {
        this.connect = connect;
        this.sessionTimeout = sessionTimeout;
        zk = getZookeeper();
    }
    /**
     * 创建节点
     * @param path 节点路径
     * @param data  节点内容
     * @return
     */
    public boolean createZNode(String path,String data) {

        if (this.isExists(path))
        {
            log.info("该节点已存在请勿再次创建");
            return true;
        }
        //具体状态码
//        String params = "123";
//        CountDownLatch count = new CountDownLatch(1);
        try {
//            Consumer<WatchedEvent> watchedEventConsumer = (WatchedEvent watchedEvent) -> {
//                zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {
//                    public void processResult(int rc, String path, Object ctx, String name) {
//                        log.info("Object ctx 参数对应于create 方法最后一个参数");
//                        log.info(ctx.toString());
//                        KeeperException.Code code = KeeperException.Code.get(rc);
//                        log.info("code" + code.toString());
//                        switch (code) {
//                            case OK:
//                                count.countDown();
//                            case NOAUTH:
//                            case NONODE:
//                            case APIERROR:
//                            case NOTEMPTY:
//                            case AUTHFAILED:
//                            case BADVERSION:
//                            case INVALIDACL:
//                            case NODEEXISTS:
//                            case NOTREADONLY:
//                            case SYSTEMERROR:
//                            case BADARGUMENTS:
//                            case SESSIONMOVED:
//                            case UNIMPLEMENTED:
//                            case CONNECTIONLOSS:
//                            case SESSIONEXPIRED:
//                            case INVALIDCALLBACK:
//                            case MARSHALLINGERROR:
//                            case OPERATIONTIMEOUT:
//                            case DATAINCONSISTENCY:
//                            case RUNTIMEINCONSISTENCY:
//                            case NOCHILDRENFOREPHEMERALS:
//                        }
//                    }
//                }, params);
//                try {
//                    TimeUnit.SECONDS.sleep(10);
//                } catch (InterruptedException e) {
//                    log.error("TimeUnit Sleep error => ", e);
//                }
//            };
//            count.await();
            String zkPath = zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            log.info("Zookeeper创建节点成功,节点地址:" + zkPath);
            return true;
        }catch (Exception e)
        {
            log.error("创建节点失败",e);
        }
        return false;
    }
    /**
     * 删除一个节点
     * @param path 节点路径
     * @return
     */
    public boolean deteleZKNode(String path){
        try{
            zk.delete(path,-1);
            log.info("Zookeeper删除节点成功,节点地址:" + path);
            return  true;
        }catch (InterruptedException e){
            log.error("删除节点失败:" + e.getMessage() + ",path:" + path,e);
        }catch (KeeperException e){
            log.error("删除节点失败:" + e.getMessage() + ",path:" + path,e);
        }
        return false;
    }
    /**
     * 更新节点内容
     * @param path 节点路径
     * @param data 节点数据
     * @return
     */
    public boolean updateZKNodeData(String path,String data){
        try {
            Stat stat = zk.setData(path,data.getBytes(),-1);
            log.info("更新节点数据成功,path:" + path+", stat:" + stat);
            return  true;
        } catch (KeeperException e) {
            log.error("更新节点数据失败:" + e.getMessage() + ",path:" + path ,e);
        } catch (InterruptedException e) {
            log.error("更新节点数据失败:" + e.getMessage() + ",path:" + path ,e);
        }
        return false;
    }

    /**
     * 读取指定节点的内容
     * @param path 指定的路径
     * @return
     */
    public String readData(String path){
        String data=null;
        try {
            log.info("wathcer注册getData<=====" + path + "==============>");
            data = new String(zk.getData(path,watchedEvent -> {
                log.info("getData调用  getPath => " + watchedEvent.getPath());
                log.info("getData调用 getState => " + watchedEvent.getState().toString());
                log.info("getData调用 getType => " + watchedEvent.getType().toString());
            },null));
            log.info("读取数据成功,其中path:" + path+ ", data-content:" + data);
        } catch (KeeperException e) {
            log.error( "读取数据失败,发生KeeperException! path: " + path + ", errMsg:" + e.getMessage(), e );
        } catch (InterruptedException e) {
            log.error( "读取数据失败,InterruptedException! path: " + path + ", errMsg:" + e.getMessage(), e );
        }
        return data;
    }
    /**
     * 获取某个节点下的所有节点
     * @param path 节点路径
     * @return
     */
    public List<String> getChild(String path){
        log.info("wathcer注册getChildren<=====" + path + "==============>");
        try {
            List<String> list = zk.getChildren(path,watchedEvent -> {
                log.info("getChildren调用  getPath => " + watchedEvent.getPath());
                log.info("getChildren调用 getState => " + watchedEvent.getState().toString());
                log.info("getChildren调用 getType => " + watchedEvent.getType().toString());
            });
            if(list.isEmpty()){
                log.info(path + "的路径下没有节点");
            }
            return list;
        } catch (KeeperException e) {
            log.error( "读取子节点数据失败,发生KeeperException! path: " + path
                    + ", errMsg:" + e.getMessage(), e );
        } catch (InterruptedException e) {
            log.error( "读取子节点数据失败,InterruptedException! path: " + path
                    + ", errMsg:" + e.getMessage(), e );
        }
        return null;
    }

    /**判断路劲节点是否存在
     * @param path
     * @return
     */
    public boolean isExists(String path){
        try {
            log.info("wathcer注册exists<=====" + path + "==============>");
            Stat stat = zk.exists(path,watchedEvent -> {
                log.info("exists调用  getPath => " + watchedEvent.getPath());
                log.info("exists调用 getState => " + watchedEvent.getState().toString());
                log.info("exists调用 getType => " + watchedEvent.getType().toString());
            });
            return null != stat;
        } catch (KeeperException e) {
            log.error( "读取数据失败,发生KeeperException! path: " + path
                    + ", errMsg:" + e.getMessage(), e );
        } catch (InterruptedException e) {
            log.error( "读取数据失败,发生InterruptedException! path: " + path
                    + ", errMsg:" + e.getMessage(), e );
        }
        return  false;
    }
}

  1. ZooUtilTest类用于测试
package com.skindow.zookeeper;

import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by Administrator on 2019/8/5.
 */
@Slf4j
public class ZooUtilTest {
    public static void main(String[] args) throws InterruptedException {
//        ZookeeperUtil zt = new ZookeeperUtil("127.0.0.1:2181",2000);
//        zt.createZNode("/Skindow","8月5号测试");
//        zt.createZNode("/Skindow/no_1","test1");
//        List<String> skindow = zt.getChild("/Skindow");
//        String s = skindow.stream().collect(Collectors.joining(",")).toString();
//        log.info("skindow ==>"  + s);
//        String s1 = zt.readData("/Skindow");
//        log.info("s1 ==》" + s1);
//        zt.deteleZKNode("/Skindow/no_1");
//        log.info("delete after => "+ zt.getChild("/Skindow").stream().collect(Collectors.joining(",")).toString());
//        zt.updateZKNodeData("/Skindow","8月5号测试下班");
//        log.info("update after" + zt.readData("/Skindow"));
        ZkWatchTest zt = new ZkWatchTest("127.0.0.1:2181",2000);
//        zt.deteleZKNode("/test_watcher");//不支持递归删除 这一行代码会报错 因为该节点下存在watcher_children节点
        zt.createZNode("/test_watcher","8月6号测试");
        zt.createZNode("/test_watcher/watcher_children","wc_test");
        log.info("watcher_children read data => " + zt.readData("/test_watcher/watcher_children"));
        zt.deteleZKNode("/test_watcher/watcher_children");
        zt.updateZKNodeData("/test_watcher","8月6号测试");
    }
}
  1. 以下是测试结果
"C:\Program Files\Java\jdk1.8.0_131\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51896,suspend=y,server=n -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\java_project\myfirstSpringboot\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.1.6.RELEASE\spring-boot-starter-data-jpa-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.1.6.RELEASE\spring-boot-starter-aop-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.1.8.RELEASE\spring-aop-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar;C:\Users\Administrator\.m2\repository\javax\transaction\javax.transaction-api\1.3\javax.transaction-api-1.3.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\Administrator\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Administrator\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\Administrator\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\Administrator\.m2\repository\net\bytebuddy\byte-buddy\1.9.13\byte-buddy-1.9.13.jar;C:\Users\Administrator\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\Administrator\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\Administrator\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-jpa\2.1.9.RELEASE\spring-data-jpa-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-commons\2.1.9.RELEASE\spring-data-commons-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-orm\5.1.8.RELEASE\spring-orm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-tx\5.1.8.RELEASE\spring-tx-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.1.8.RELEASE\spring-beans-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aspects\5.1.8.RELEASE\spring-aspects-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.1.6.RELEASE\spring-boot-starter-jdbc-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.1.6.RELEASE\spring-boot-starter-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.1.6.RELEASE\spring-boot-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.1.6.RELEASE\spring-boot-autoconfigure-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.1.6.RELEASE\spring-boot-starter-logging-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;C:\Users\Administrator\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;C:\Users\Administrator\.m2\repository\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jdbc\5.1.8.RELEASE\spring-jdbc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.1.6.RELEASE\spring-boot-starter-web-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.1.6.RELEASE\spring-boot-starter-json-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.1.6.RELEASE\spring-boot-starter-tomcat-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.21\tomcat-embed-core-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.21\tomcat-embed-el-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.21\tomcat-embed-websocket-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\5.1.8.RELEASE\spring-web-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\5.1.8.RELEASE\spring-webmvc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.1.8.RELEASE\spring-expression-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web-services\2.1.6.RELEASE\spring-boot-starter-web-services-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\sun\xml\messaging\saaj\saaj-impl\1.5.0\saaj-impl-1.5.0.jar;C:\Users\Administrator\.m2\repository\javax\xml\soap\javax.xml.soap-api\1.4.0\javax.xml.soap-api-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\jvnet\mimepull\mimepull\1.9.11\mimepull-1.9.11.jar;C:\Users\Administrator\.m2\repository\org\jvnet\staxex\stax-ex\1.8\stax-ex-1.8.jar;C:\Users\Administrator\.m2\repository\javax\xml\ws\jaxws-api\2.3.1\jaxws-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-oxm\5.1.8.RELEASE\spring-oxm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-ws-core\3.0.7.RELEASE\spring-ws-core-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-xml\3.0.7.RELEASE\spring-xml-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-jdbc\2.1.7.RELEASE\spring-session-jdbc-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-core\2.1.7.RELEASE\spring-session-core-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.1.8.RELEASE\spring-context-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.16\mysql-connector-java-8.0.16.jar;C:\Users\Administrator\.m2\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper\3.5.5\zookeeper-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper-jute\3.5.5\zookeeper-jute-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;C:\Users\Administrator\.m2\repository\io\netty\netty-all\4.1.36.Final\netty-all-4.1.36.Final.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar" com.skindow.zookeeper.ZooUtilTest
Connected to the target VM, address: '127.0.0.1:51896', transport: 'socket'
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
14:52:24.844 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.5.5-390fe37ea45dee01bf87dc1c042b5e3dcce88653, built on 05/03/2019 12:07 GMT
14:52:24.849 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=CL-20026.clps.com.cn
14:52:24.849 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.8.0_131
14:52:24.850 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation
14:52:24.850 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=C:\Program Files\Java\jdk1.8.0_131\jre
14:52:24.850 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\java_project\myfirstSpringboot\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.1.6.RELEASE\spring-boot-starter-data-jpa-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.1.6.RELEASE\spring-boot-starter-aop-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.1.8.RELEASE\spring-aop-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar;C:\Users\Administrator\.m2\repository\javax\transaction\javax.transaction-api\1.3\javax.transaction-api-1.3.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\Administrator\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Administrator\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\Administrator\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\Administrator\.m2\repository\net\bytebuddy\byte-buddy\1.9.13\byte-buddy-1.9.13.jar;C:\Users\Administrator\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\Administrator\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\Administrator\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-jpa\2.1.9.RELEASE\spring-data-jpa-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\data\spring-data-commons\2.1.9.RELEASE\spring-data-commons-2.1.9.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-orm\5.1.8.RELEASE\spring-orm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-tx\5.1.8.RELEASE\spring-tx-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.1.8.RELEASE\spring-beans-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aspects\5.1.8.RELEASE\spring-aspects-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.1.6.RELEASE\spring-boot-starter-jdbc-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.1.6.RELEASE\spring-boot-starter-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.1.6.RELEASE\spring-boot-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.1.6.RELEASE\spring-boot-autoconfigure-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.1.6.RELEASE\spring-boot-starter-logging-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;C:\Users\Administrator\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;C:\Users\Administrator\.m2\repository\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jdbc\5.1.8.RELEASE\spring-jdbc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.1.6.RELEASE\spring-boot-starter-web-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.1.6.RELEASE\spring-boot-starter-json-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.1.6.RELEASE\spring-boot-starter-tomcat-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.21\tomcat-embed-core-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.21\tomcat-embed-el-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.21\tomcat-embed-websocket-9.0.21.jar;C:\Users\Administrator\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\5.1.8.RELEASE\spring-web-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\5.1.8.RELEASE\spring-webmvc-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.1.8.RELEASE\spring-expression-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web-services\2.1.6.RELEASE\spring-boot-starter-web-services-2.1.6.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\sun\xml\messaging\saaj\saaj-impl\1.5.0\saaj-impl-1.5.0.jar;C:\Users\Administrator\.m2\repository\javax\xml\soap\javax.xml.soap-api\1.4.0\javax.xml.soap-api-1.4.0.jar;C:\Users\Administrator\.m2\repository\org\jvnet\mimepull\mimepull\1.9.11\mimepull-1.9.11.jar;C:\Users\Administrator\.m2\repository\org\jvnet\staxex\stax-ex\1.8\stax-ex-1.8.jar;C:\Users\Administrator\.m2\repository\javax\xml\ws\jaxws-api\2.3.1\jaxws-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-oxm\5.1.8.RELEASE\spring-oxm-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-ws-core\3.0.7.RELEASE\spring-ws-core-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\ws\spring-xml\3.0.7.RELEASE\spring-xml-3.0.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-jdbc\2.1.7.RELEASE\spring-session-jdbc-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\session\spring-session-core\2.1.7.RELEASE\spring-session-core-2.1.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.1.8.RELEASE\spring-context-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.16\mysql-connector-java-8.0.16.jar;C:\Users\Administrator\.m2\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper\3.5.5\zookeeper-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper-jute\3.5.5\zookeeper-jute-3.5.5.jar;C:\Users\Administrator\.m2\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;C:\Users\Administrator\.m2\repository\io\netty\netty-all\4.1.36.Final\netty-all-4.1.36.Final.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\VanDyke Software\Clients\;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.8.0_131\bin;D:\Program Files\apache-tomcat-7.0.68\lib;D:\Program Files\apache-tomcat-7.0.68\bin;C:\Program Files\MySQL\MySQL Server 5.5\bin;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;%MAVEN_HOME%\bin;D:\Program Files\Git\cmd;.
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA>
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 7
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=6.1
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=Administrator
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:\Users\Administrator
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=D:\java_project\myfirstSpringboot
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.free=113MB
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.max=1796MB
14:52:24.852 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.total=123MB
14:52:24.869 [Thread-0] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=2000 watcher=com.skindow.zookeeper.ZkWatchTest$1@1b7cea92
14:52:24.878 [Thread-0] INFO org.apache.zookeeper.common.X509Util - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
14:52:25.126 [Thread-0] INFO org.apache.zookeeper.ClientCnxnSocket - jute.maxbuffer value is 4194304 Bytes
14:52:25.139 [Thread-0] INFO org.apache.zookeeper.ClientCnxn - zookeeper.request.timeout value is 0. feature enabled=
CONNECTING.....
14:52:25.144 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.SaslServerPrincipal - Canonicalized address to 127.0.0.1
14:52:25.147 [Thread-0-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
14:52:25.149 [Thread-0-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established, initiating session, client: /127.0.0.1:51902, server: 127.0.0.1/127.0.0.1:2181
14:52:25.153 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
14:52:25.161 [Thread-0-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x1005cdf7eeb002a, negotiated timeout = 4000
14:52:25.166 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - watchedEvent.getPath(); => null
14:52:25.166 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - watchedEvent.getState(); => SyncConnected
14:52:25.166 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - watchedEvent.getType(); =>None
14:52:26.139 [Thread-0] INFO com.skindow.zookeeper.ZkWatchTest - 连接成功!
14:52:26.139 [main] INFO com.skindow.zookeeper.ZkWatchTest - wathcer注册exists<=====/test_watcher==============>
14:52:26.167 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1005cdf7eeb002a, packet:: clientPath:null serverPath:null finished:false header:: 1,3  replyHeader:: 1,128,0  request:: '/test_watcher,T  response:: s{98,126,1565071201330,1565074308907,3,6,0,0,14,0,111} 
14:52:26.175 [main] INFO com.skindow.zookeeper.ZkWatchTest - 该节点已存在请勿再次创建
14:52:26.175 [main] INFO com.skindow.zookeeper.ZkWatchTest - wathcer注册exists<=====/test_watcher/watcher_children==============>
14:52:26.230 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1005cdf7eeb002a, packet:: clientPath:null serverPath:null finished:false header:: 2,3  replyHeader:: 2,128,-101  request:: '/test_watcher/watcher_children,T  response::  
14:52:26.254 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x1005cdf7eeb002a
14:52:26.256 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeCreated path:/test_watcher/watcher_children for sessionid 0x1005cdf7eeb002a
14:52:26.256 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - exists调用  getPath => /test_watcher/watcher_children
14:52:26.256 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - exists调用 getState => SyncConnected
14:52:26.256 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - exists调用 getType => NodeCreated
14:52:26.258 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1005cdf7eeb002a, packet:: clientPath:null serverPath:null finished:false header:: 3,1  replyHeader:: 3,129,0  request:: '/test_watcher/watcher_children,#77635f74657374,v{s{31,s{'world,'anyone}}},0  response:: '/test_watcher/watcher_children 
14:52:26.258 [main] INFO com.skindow.zookeeper.ZkWatchTest - Zookeeper创建节点成功,节点地址:/test_watcher/watcher_children
14:52:26.258 [main] INFO com.skindow.zookeeper.ZkWatchTest - wathcer注册getData<=====/test_watcher/watcher_children==============>
14:52:26.266 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1005cdf7eeb002a, packet:: clientPath:null serverPath:null finished:false header:: 4,4  replyHeader:: 4,129,0  request:: '/test_watcher/watcher_children,T  response:: #77635f74657374,s{129,129,1565074346251,1565074346251,0,0,0,0,7,0,129} 
14:52:26.266 [main] INFO com.skindow.zookeeper.ZkWatchTest - 读取数据成功,其中path:/test_watcher/watcher_children, data-content:wc_test
14:52:26.267 [main] INFO com.skindow.zookeeper.ZooUtilTest - watcher_children read data => wc_test
14:52:26.371 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x1005cdf7eeb002a
14:52:26.372 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeDeleted path:/test_watcher/watcher_children for sessionid 0x1005cdf7eeb002a
14:52:26.372 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - getData调用  getPath => /test_watcher/watcher_children
14:52:26.372 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - getData调用 getState => SyncConnected
14:52:26.372 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - getData调用 getType => NodeDeleted
14:52:26.372 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1005cdf7eeb002a, packet:: clientPath:null serverPath:null finished:false header:: 5,2  replyHeader:: 5,130,0  request:: '/test_watcher/watcher_children,-1  response:: null
14:52:26.372 [main] INFO com.skindow.zookeeper.ZkWatchTest - Zookeeper删除节点成功,节点地址:/test_watcher/watcher_children
14:52:26.384 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x1005cdf7eeb002a
14:52:26.385 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeDataChanged path:/test_watcher for sessionid 0x1005cdf7eeb002a
14:52:26.386 [Thread-0-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x1005cdf7eeb002a, packet:: clientPath:null serverPath:null finished:false header:: 6,5  replyHeader:: 6,131,0  request:: '/test_watcher,#38ffffffe6ffffff9cffffff8836ffffffe5ffffff8fffffffb7ffffffe6ffffffb5ffffff8bffffffe8ffffffafffffff95,-1  response:: s{98,131,1565071201330,1565074346374,4,8,0,0,14,0,130} 
14:52:26.386 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - exists调用  getPath => /test_watcher
14:52:26.386 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - exists调用 getState => SyncConnected
14:52:26.387 [Thread-0-EventThread] INFO com.skindow.zookeeper.ZkWatchTest - exists调用 getType => NodeDataChanged
14:52:26.388 [main] INFO com.skindow.zookeeper.ZkWatchTest - 更新节点数据成功,path:/test_watcher, stat:98,131,1565071201330,1565074346374,4,8,0,0,14,0,130

Disconnected from the target VM, address: '127.0.0.1:51896', transport: 'socket'

Process finished with exit code 0

本文代码克隆地址: https://github.com/skindowSyc/firstProject.git 仅供参考 对应tag zookeeper

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值