在上几篇搞懂了Watcher的理论之后,依照网上的资料,写了一段ZooKeeper关于Watcher的实例。(注释里解释的很详细了)
监视器:
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
/**
* 监视服务器
* @author tangxuelei
*
*/
public class ZKServerWatcher implements Watcher {
private String groupNode = "sgroup";
private ZooKeeper zk;
private Stat stat = new Stat();
//用Map存储服务器信息,key是服务器节点path,value是服务器信息。服务器信息又 包含了服务器名称和负载
private volatile Map<String, ServerInfo> serverMap = new HashMap<String, ServerInfo> ();
/*
* 连接zk
*/
public void connectZooKeeper() throws Exception {
//这里的this就是注册了一个默认Watcher,不过注意该Watcher并不是一次性的。
zk = new ZooKeeper("127.0.0.1:2183", 2000, this);
//查看要检测的服务器集群的根节点是否存在,如果不存在,则创建
zk.create("/"+groupNode, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
updateServerList();
}
/*
* 更新服务器列表
*/
private void updateServerList() throws Exception {
Map<String, ServerInfo> newServerMap = new HashMap<String, ServerInfo>();
// 获取并监听groupNode的子节点变化
// watch参数为true, 表示监听子节点变化事件.
// 每次都需要重新注册监听, 因为一次注册, 只能监听一次事件, 如果还想继续保持监听, 必须重新注册
//这里的true表示注