实际项目开发中,用的是Linux环境。
看日志,报错如下:
Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /test
at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1501)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1529)
at com.jiq.test.ZooKeeperTest.main(ZooKeeperTest.java:12)
经过实践,最终发现是“防火墙”的原因。
主要参考了网上的一篇文章。
不正确的解决办法:
“上网一查,全是说什么到Zookeeper服务的连接未完成,说是加下面这段代码就好了:
CountDownLatch connectedLatch = new CountDownLatch(1);
if (States.CONNECTING == zk.getState()) {
try {
connectedLatch.await();
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}
我觉得这有点扯淡,首先官网没有任何提到要加这样的代码来等待连接准备好的话语,其次为什么本机可以,远端就不行,难道天生本机就一定能够快速建立好连接,远端就要等一等么?
于是我决定自己思考,想了一天才觉得可能是防火墙问题,于是把windwos server 2008防火墙关闭,OK了,把CentOS防火墙关闭,也OK了,哎!”
看了这个哥们的描述,我深以为然啊。
我也尝试过,加一些乱七八糟的代码,发现都不能解决问题。
最终,尝试了这个哥们的“关闭防火墙”的解决办法。
但是,这篇文章中,永久关闭防火墙的那种方式,是不对的,只要使用了,Zookeeper就连接不上。
“CentOS关闭防火墙命令:
CentOS Linux开启和关闭防火墙命令有两种,一种是临时的,重启即复原;另外一种是永久xìng的,重启不会复原。
1) 临时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
2) 永久xìng生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
我执行的是永久修改的命令,执行完了也可以不重启电脑,重启防火墙服务即可: service iptables restart ”
实际中,我用的是临时的关闭防火墙的办法,这样,如果服务器再次断电重启,还需要手动关闭。
这个哥们貌似是“永久关闭防火墙”,反正我也试了,永久关闭,总是不行,可能是我的问题。
这个哥们说,不用重启服务器,反正我没有重启,不知道重启了效果会如何。