watcher:一个watcher对象,如果创建,当状态改变和发生节点事件时会收到通知。这个watcher对象需要通过一个用户定义的类单独创建,通过实现Watcher接口并将实例化的对象传递给ZooKeeper构造方法。客户端应用程序可以收到各种类型的事件的通知,例如连接丢失、会话过期等。
ZooKeeper Java API定义了另外带有三个参数的构造方法,以指定更高级的操作。代码如下:
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)在ZooKeeper类的上面的构造方法中,如果设置为true,boolean canBeReadOnly参数允许创建的客户端在网络分区的情况下进入只读模式。只读模式是客户端无法找到任何多数服务器的场景,但有一个可以到达的分区服务器,以只读模式连接到它,这样就允许对服务器的读取请求,而写入请求则不允许。客户端继续尝试在后台连接到大多数服务器,同时仍然保持只读模式。分区服务器仅仅是ZooKeeper组的一个子集,它是由于集群中的网络分配而形成的。大多数服务器构成了ensemble中的大多数quorum。
以下构造方法显示了两个附加参数的定义:
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd)这个构造方法允许ZooKeeper客户端对象创建两个额外的参数:
sessionId:在客户端重新连接到ZooKeeper服务器的情况下,可以使用特定的会话ID来引用先前连接的会话
sessionPasswd:如果指定的会话需要密码,可以在这里指定
以下构造方法是前两个调用的组合:
ZooKeeper(String connectString, int sessionTimeout,Watcher watcher, long sessionId, byte[] sessionPasswd,boolean canBeReadOnly)此构造方法是前两个调用的组合,允许在启用只读模式的情况下重新连接到指定的会话。
Note
ZooKeeper类的详细Java API文档可以在上查询。
现在,回到我们的ZooKeeper程序。 在调用构造方法后,如果连接成功,我们将得到ZooKeeper服务器的引用。 我们通过下面的代码将引用传递给getChildren方法:
zooChildren = zk.getChildren(zpath, false)ZooKeeper类的getChildren(String path,boolean watch)方法返回给定路径上znode的子级列表。 我们只是迭代这个方法返回的列表,并将字符串打印到控制台。
将程序命名为HelloZooKeeper.java,并编译我们的程序如下:
$ javac -cp $CLASSPATH HelloZooKeeper.java在我们运行的程序之前,需要使用以下命令来启动ZooKeeper服务器实例:
$ ${ZK_HOME}/bin/zkServer.sh start运行程序如下:
$ java -cp $CLASSPATH HelloZooKeeper执行程序会在控制台上打印日志消息,显示所使用的ZooKeeper版本,Java版本,Java类路径,服务器体系结构等等。 这里显示了这些日志消息的一部分:
ZooKeeper Java API生成的日志消息对调试非常有用。 它为我们提供了关于客户端连接到ZooKeeper服务器,建立会话等后台得信息。 上面显示的最后三条日志消息告诉我们客户端如何使用程序中指定的参数来启动连接,以及在成功连接后,服务器如何为客户端分配会话ID。
最后,程序执行最后在控制台中输出以下内容:
我们可以使用ZooKeeper shell来验证程序的正确性:
$ $ZK_HOME/bin/zkCli.sh -server localhost恭喜! 我们刚刚成功编写了我们的第一个ZooKeeper客户端程序。
二 实现Watcher接口ZooKeeper Watcher监视使客户端能够接收来自ZooKeeper服务器的通知,并在发生时处理这些事件。 ZooKeeper Java API提供了一个名为Watcher的公共接口,客户端事件处理程序类必须实现该接口才能接收有关来自ZooKeeper服务器的事件通知。 以编程方式,使用这种客户端的应用程序通过向客户端注册回调(callback)对象来处理这些事件。
我们将实现Watcher接口,处理与znode关联的数据更改时由ZooKeeper生成的事件。
Watcher接口在org.apache.zookeeper包中声明如下:
public interface Watcher { void process(WatchedEvent event); }为了演示znode数据监视器(Watcher),有两个Java类:DataWatcher和DataUpdater。 DataWatcher将一直运行,并在/MyConfig指定znode路径中侦听来自ZooKeeper服务器的NodeDataChange事件。DataUpdater类将定期更新此znode路径中的数据字段,这将生成事件,并且在接收到这些事件后,DataWatcher类将把更改后的数据打印到控制台上。