ZooKeeper 在官网着重提示在使用 Watch 的时候要注意:
- Watch 是一次性的,如果 watch 事件发生了,还想 watch 需要再设置新的watch
- 因为 watch 的一次性,再次注册 watch 的网络延迟,所以 znode 每次变更不可能都 watch 到
- 一个 watch 对象或者函数/上下文对(pair),只会触发一次。比如,如果相同的 watch 对象注册了 exist 和 getData 调用在相同文件,并且文件已经被删除,watch 对象只会在文件被删除触发一次
- 当你与一个服务断开(比如zk服务宕机),你将不会获得任何 watch,直到连接重连。因此,session 事件将会发送给所有 watch 处理器。使用 session 事件进入一个安全模式:当断开连接的时候将不会收到任何事件,因此您的进程应该以该模式保守运行
用代码表现一下 Watch 回调事件丢失:
package com.wenniuwuren.zookeeper.curator.watch;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
import org.apache.curator.retry.ExponentialBackof