之前完成的项目作用zookeeper用作服务发现,抽象出注册和监听功能,供其他项目使用。对zookeeper的一些细节作个记录吧。
我们知道通过Zookeeper对象实例实现对zookeeper服务的调用。首先的问题就是消息的发送和接受,以及事件的回调。这里我们把目光转向ClientCnxn
创建实例
public ClientCnxn(String chrootPath, HostProvider hostProvider, int sessionTimeout, ZooKeeper zooKeeper,
ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket,
long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) {
....
/**
* send线程完成发送request,接受response,生成event
* event线程派发event
*/
sendThread = new SendThread(clientCnxnSocket);
eventThread = new EventThread();
}
`SendThread线程`
public void run() {
//最大心跳间隔
final int MAX_SEND_PING_INTERVAL = 10000;
while (state.isAlive()) {
try {
//1、如果末连接,随机休眠1~1000,根据closing(用户请求)决定是跳出还是重连
//2、如果需要登录,进行登录请求,根据结果生成事件
if (zooKeeperSaslClient != null) {
。。。
if (sendAuthEvent == true) {
eventThread.queueEvent(new WatchedEvent(
Watcher.Event.EventType.None,
authState,null));
}
}
//3、如果waitTimeOut超时,抛出SessionTimeoutException