Apache zookeeper org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLoss在我得到zk';s子节点

Apache zookeeper org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLoss在我得到zk';s子节点,apache-zookeeper,Apache Zookeeper,情况如下: 我调用client.getChildren().forPath(“/path”),在正常情况下没有问题 但是如果子节点太多,则会出现异常:org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLoss for/path 守则: RetryNTimes retryNTimes = new RetryNTimes(1, 1000); Cu

情况如下: 我调用client.getChildren().forPath(“/path”),在正常情况下没有问题

但是如果子节点太多,则会出现异常:org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLoss for/path

守则:

        RetryNTimes retryNTimes = new RetryNTimes(1, 1000);
        CuratorFramework client = CuratorFrameworkFactory.newClient("xx.xx.xx.xx:2181",
                50000, 50000, retryNTimes);
        client.start();
        List<String> childNodes = client.getChildren().forPath("/path");
RetryNTimes-RetryNTimes=新的RetryNTimes(11000);
CuratorFramework client=CuratorFrameworkFactory.newClient(“xx.xx.xx.xx:2181”,
50000次,50000次,重试次数);
client.start();
List childNodes=client.getChildren().forPath(“/path”);
zkServer为三节点集群,版本为3.4.13

我的客户中的策展人版本是2.12.0


有人帮我一个忙

最后,我找到了源原因。子节点太多。因此来自服务器的数据包长度超过了客户端数据包的长度限制(1024*4096)。因此我设置了系统属性-Djute.maxbuffer=10485760。问题解决了

关系代码:

 public static final int packetLen = Integer.getInteger("jute.maxbuffer",
            4096 * 1024);

   protected void readLength() throws IOException {
        int len = incomingBuffer.getInt();
        if (len < 0 || len >= ClientCnxn.packetLen) {
            throw new IOException("Packet len" + len + " is out of range!");
        }
        incomingBuffer = ByteBuffer.allocate(len);
    }

        private void conLossPacket(Packet p) {
        if (p.replyHeader == null) {
            return;
        }
        switch (state) {
        case AUTH_FAILED:
            p.replyHeader.setErr(KeeperException.Code.AUTHFAILED.intValue());
            break;
        case CLOSED:
            p.replyHeader.setErr(KeeperException.Code.SESSIONEXPIRED.intValue());
            break;
        default:
            p.replyHeader.setErr(KeeperException.Code.CONNECTIONLOSS.intValue());
        }
        finishPacket(p);
    }
  
public static final int packetLen=Integer.getInteger(“jute.maxbuffer”,
4096 * 1024);
受保护的void readLength()引发IOException{
int len=incomingBuffer.getInt();
如果(len<0 | | len>=ClientCnxn.packetLen){
抛出新IOException(“数据包len+len+超出范围!”);
}
incomingBuffer=ByteBuffer.allocate(len);
}
专用void conLossPacket(数据包p){
if(p.replyHeader==null){
回来
}
开关(状态){
案例验证失败:
p、 replyHeader.setErr(KeeperException.Code.AUTHFAILED.intValue());
打破
结案:
p、 replyHeader.setErr(KeeperException.Code.SESSIONEXPIRED.intValue());
打破
违约:
p、 replyHeader.setErr(KeeperException.Code.CONNECTIONLOSS.intValue());
}
精加工袋(p);
}
逻辑如下:

org.apache.zookeeper.ClientCnxn.SendThread#run;->clientCnxnSocket.doTransport(to,pendingQueue,outgoingQueue,ClientCnxn.this);->doIO(pendingQueue,outgoingQueue,cnxn);->readLength();->cleanup();->conLossPacket(p)

异常:“org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLoss for/path”可能会误导用户