看源码,老实说我没什么很好的方法。所以,只能静下心来看,一步一步的看。
我认为每个程序都有个门,要想进入,首先得把这个门找到,而我找到的katta的门是Katta.java
Katta.java中有个main方法,接收你输入的命令(String[] args)
1.startNode
2.startMaster
3.version
4.zk
5.search
6.addIndex
7.removeIndex
8.mergeIndexes
9.listIndexes
10.listNodes
11.showStructure
12.check
13.listErrors
14.redeployIndex
如果想要知道有多少个节点已经连接了,那么输入listIndexes
main方法先判断是否有值输入,如果没有调用printUsageAndExit(),给出输入的格式并退出程序。
现在当然是有输入咯,然后就是要Katta显示所有节点了,它调用Katta的构造函数
katta = new Katta();
Katta的构造函数,它调用了ZkConfiguration ,ZKClient的构造函数。
public Katta() throws KattaException {
final ZkConfiguration configuration = new ZkConfiguration();
_zkClient = new ZKClient(configuration);
_zkClient.start(10000);
}
ZkConfiguration 它继承了KattaConfiguration类,KattaConfiguration类是一个配置类,它读取katta.zk.properties
文件,生成Properties,方便下一步的读取操作。
ZKClient它实现了Zookeeper的Watcher,Watcher是一个事件处理程序的接口。
_zkClient = new ZKClient(configuration);
在ZKClient的构造函数中,把configuration作为参数传了进去,然后读取katta.zk.properties这个文件的
zookeeper.servers,zookeeper.timeout和zookeeper.clientPort
_zkClient.start(10000);
打开一个Zookeeper的客户端,并等待Zookeeper服务器的连接。
使用同步的机制, getEventLock().lock();
调用ZooKeeper的构造函数:
ZooKeeper _zk = new ZooKeeper(_servers, _timeOut, this);
把从katta.zk.properties这个文件中读取的服务器名,超时时间和Zookeeper它本身作为参数传入这个构造函数。
在Zookeeper的构造函数中又调用了ClientCnxn 的构造函数
ClientCnxn cnxn = new ClientCnxn(host, sessionTimeout, this);
ClientCnxn 为客户端管理socket的i/o,并保持一份可用的服务器连接。
在ClientCnxn的构造函数中调用了两个线程,SendThread和EventThread
SendThread 这个类服务那些即将离任的请求队列。
EventThread 这个类服务于返回的信息事件。
当ZooKeeper的状态为CONNECTED时说明已经连接。
katta实例调用它的listNodes()方法以显示节点
在listNodes()方法中,调用ZKClient的getKnownNodes()方法,返回一个List对象。
NodeMetaData nodeMetaData = new NodeMetaData();
Katta把节点信息封装到NodeMetaData 对象中。
Table table = new Table();
table.addRow(nodeMetaData.getName(), nodeMetaData.getStartTimeAsDate(), nodeState.name());
把需要显示的数据封装到Katta的Table中
System.out.println(table.toString());
显示出来。