yanfangsheng123 发表于 2015-11-22 09:17:36

ZooKeeper Connection Loss 异常

原因:
一般是由于连接还未完成就执行zookeeper的get/create/exsit操作引起的.
解决方法:
利用"CountDownLatch 类 + zookeeper的watcher + zookeeper的getStat" 实现连接完成后再调用.
可防止此错误发生.


示例类如下(为一配置获取类):

viewplaincopy
[*]import java.util.concurrent.CountDownLatch;
[*]
[*]
[*]import org.apache.zookeeper.WatchedEvent;
[*]import org.apache.zookeeper.Watcher;
[*]import org.apache.zookeeper.Watcher.Event.KeeperState;
[*]import org.apache.zookeeper.ZooKeeper;
[*]import org.apache.zookeeper.ZooKeeper.States;
[*]import org.apache.zookeeper.data.Stat;
[*]public class Conf{
[*]    public static void waitUntilConnected(ZooKeeper zooKeeper, CountDownLatch connectedLatch) {
[*]      if (States.CONNECTING == zooKeeper.getState()) {
[*]            try {
[*]                connectedLatch.await();
[*]            } catch (InterruptedException e) {
[*]                throw new IllegalStateException(e);
[*]            }
[*]      }
[*]    }
[*]   
[*]    static class ConnectedWatcher implements Watcher {
[*]   
[*]      private CountDownLatch connectedLatch;
[*]   
[*]      ConnectedWatcher(CountDownLatch connectedLatch) {
[*]            this.connectedLatch = connectedLatch;
[*]      }
[*]   
[*]      @Override
[*]      public void process(WatchedEvent event) {
[*]         if (event.getState() == KeeperState.SyncConnected) {
[*]               connectedLatch.countDown();
[*]         }
[*]      }
[*]    }
[*]    static public Conf Instance(){
[*]      if(static_ == null){
[*]            static_ = new Conf();
[*]      }
[*]      return static_;
[*]    }
[*]    public boolean Init(String hostports, int times){
[*]      try{
[*]            CountDownLatch connectedLatch = new CountDownLatch(1);
[*]            Watcher watcher = new ConnectedWatcher(connectedLatch);
[*]            zk_ = new ZooKeeper(hostports, times, watcher);
[*]            waitUntilConnected(zk_, connectedLatch);
[*]      }
[*]      catch(Exception e){
[*]            System.out.println(e);
[*]            return false;
[*]      }
[*]      return true;
[*]    }
[*]    public String Get(String keys){
[*]      String re = "";
[*]      String ppath = "/zookeeper";
[*]      int oldpos = -1;
[*]      int pos = 0;
[*]      while(true){
[*]            pos = keys.indexOf(".", oldpos + 1);
[*]            if(pos < 0){
[*]                ppath &#43;= &quot;/&quot;;
[*]                String str = keys.substring(oldpos &#43; 1);
[*]                ppath &#43;= str;
[*]                break;
[*]            }
[*]            ppath &#43;= &quot;/&quot;;
[*]            String str = keys.substring(oldpos &#43; 1,pos);
[*]            ppath &#43;= str;
[*]            oldpos = pos;
[*]      }
[*]      Stat stat = new Stat();
[*]      try{
[*]            byte[] b = zk_.getData(ppath, false, stat);    //获取节点的信息及存储的数据
[*]            re = new String(b);
[*]      }
[*]      catch(Exception e){
[*]            System.out.println(e);
[*]      }
[*]      return re;
[*]    }
[*]    private Conf(){
[*]         
[*]    }
[*]    private ZooKeeper zk_;
[*]    static private Conf static_;
[*]    public static void main(String args[]){
[*]      String hostports = &quot;192.168.1.88:2181,192.168.1.88:2182,192.168.1.88:2183&quot;;
[*]         
[*]      Conf.Instance().Init(hostports, 1000);
[*]         
[*]      String str = Conf.Instance().Get(&quot;conf.logicpoint.subscriberserverip&quot;);
[*]      str = Conf.Instance().Get(&quot;conf.logicpoint.subscriberserverport&quot;);
[*]      System.out.println(str);
[*]      while(true){
[*]            try{Thread.sleep(100);}
[*]            catch(Exception e){
[*]                  
[*]            }
[*]      }
[*]         
[*]    }
[*]}
页: [1]
查看完整版本: ZooKeeper Connection Loss 异常