zookeeper有两种类型的监听
- 监听节点目录的变化(增加删除节点)
ls -w /path
创建/sanguo/shuguo的永久节点(注意:临时节点不允许有子节点)
[zk: localhost:2181(CONNECTED) 5] create -s /sanguo/shuguo joke
Created /sanguo/shuguo0000000005
zkClient客户端监听/sanguo目录的变化
[zk: localhost:2181(CONNECTED) 4] ls -w /sanguo
[shuguo, shuguo0000000002, shuguo0000000003, shuguo0000000004]
[zk: localhost:2181(CONNECTED) 5]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo
- 监听节点数据的变化(修改节点的值)
get -w /path
客户端修改/sanguo的值
[zk: localhost:2181(CONNECTED) 0] get /sanguo
古代中国
[zk: localhost:2181(CONNECTED) 1] set /sanguo "古中国"
zkClient客户端监听/sanguo的值的改变
[zk: localhost:2181(CONNECTED) 20] get -w /sanguo
古代中国
[zk: localhost:2181(CONNECTED) 21]
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo
注意:1.客户端要先注册监听。
2.如果目录或数据发生改变,服务端通知客户端。客户端接到监听事件通知后,就不会继续监听。
3.需要重新注册监听。
zookeeper监听机制的实现
1.创建zkClient客户端。
2.zkClient的main()方法中启动两个线程。
connect线程:连接到zkServer,发送监听请求。(请求监听节点目录或者节点数据)。
Listen线程:用于等待处理zkServer的监听通知。
3.zkClient的connect线程连接到zkServer,并发送监听事件请求。
4.zkServer接收到zkClient的监听请求后,建立监听列表并将监听事件注册到列表中。
5.zkServer一旦发现注册的监听事件的发生,立即通知到zkClient。
6.zkClient的listen线程调用process()处理监听通知。