首先要有一个main()线程

在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。

通过connect线程将注册的监听事件发送给Zookeeper。

在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。

Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。

listener线程内部调用了process()方法。

监听节点数据的变化
get path [watch]
监听子节点增减的变化
ls path [watch]
服务端启动命令
[root@localhost zookeeper-3.5.7]# bin/zkServer.sh start

启动客户端1
[root@localhost zookeeper-3.5.7]# bin/zkCli.sh

启动客户端2
[root@localhost zookeeper-3.5.7]# bin/zkCli.sh

在客户端1上创建/user节点
[zk: localhost:2181(CONNECTED) 12] create /user "zhangsan"

在客户端2上注册监听/user 节点数据变化
[zk: localhost:2181(CONNECTED) 0] get -w /user

在客户端1上修改/user节点的数据
[zk: localhost:2181(CONNECTED) 13] set /user "wangwu"

观察客户端2收到数据变化的监听,如下图:会接收到节点改变通知。

由上图可知:在客户端1上第一次修改/user节点的值,客户端2会接收到节点改变通知。
在示例1的基础上,基础上修改客户端1中/user节点的数据
[zk: localhost:2181(CONNECTED) 14] set /user "lisi"

再次观察客户端2收到数据变化的监听,如下图:

由上图可知:在客户端1上多次修改/user节点的值,客户端2不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。
在客户端2上注册监听/user节点的子节点变化
[zk: localhost:2181(CONNECTED) 0] ls -w /user

在客户端1的 /user 节点上创建子节点
[zk: localhost:2181(CONNECTED) 3] create /user/role "testadmin"

观察客户端2收到子节点变化的监听,如下图:

注意:节点的路径变化,也是注册一次,生效一次。想多次生效,就需要多次注册。