storage R&D guy.
全部博文(1000)
分类: 云计算
2015-07-27 18:01:06
开发ZooKeeper程序的时候,写这样的代码
ZooKeeper zk = new ZooKeeper(connectString, 3000, defaultWatcher);
zk.exists("/abc",false);
会马上抛出异常
经研究发现,zk对象的建立很快,但是它并没有初始化完成,需要很长一段时间去完成,我的情况是5秒左右。如果马上调用zk.create, zk.exists都会 抛出异常
两种解决方法:
1. 增加timeout,比如把3000改为13000。 致命缺点,以后连接的timeout也是这个时间,太长了,20秒才能检测出连接断了。
2. 把zk的操作放到wather中区做,watcher只有在初始化完成后才回被调用,这样我们的timeout可以设置为1000也没有问题。
3. 一定要马上调用,用下面这段代码等待一段时间
while (States.CONNECTING == zk.getState()) sleep(300);