自己的環境在虛擬機上,於是使用同事的環境調試問題,發現無法初始化成功,提示keepererrorcode = connectionloss for,於是上網查了下資料整理如下:
1.對比代碼中引用的jar庫是否跟服務器上的一致:
服務器端:zookeeper-3.4.10.jar
代碼端:zookeeper-3.4.9.jar
2.網上還有一種說法是連接還沒創建成功,就開始設置watcher了。我們可以在創建了鏈接后,判斷鏈接狀態OK了再進行下一步操作:
public static void waitUntilConnected(ZooKeeper zooKeeper, CountDownLatch connectedLatch) { if (States.CONNECTING == zooKeeper.getState()) { try { connectedLatch.await(); } catch (InterruptedException e) { throw new IllegalStateException(e); } } }
3.這里引申出zk的一個問題:
在創建連接時,不管是否成功,都會給一個看似正確的pid,並不會管這個鏈接是否可用,或者正在連接。所以最好的方式是在創建連接后,對連接狀態進行判斷。
在我之前的博客中也遇到在solaris上用zk的時候,單線程和多線程版本使用在solaris和centos上不一致導致連,定位了好幾天,最后總結還是代碼沒有做好返回值判斷造成的。