记录一次因为ZkClient项目无法正常启动的问题

2019-10-03  本文已影响0人  ToufuDrago_c53f

之前一直正常启动的web项目,最近启动时到一半停住了。没有报任何错误,只好在启动时自动执行的代码块加断点debug看停在哪了。
通过debug发现项目启动时停在了

val dubboChildren = zkClient.getChildren("/dubbo")

看来是ZkClient获取dubbo服务时出现了问题,那么是代码的锅还是Zookeeper服务端的锅?

通过终端连接Zookeeper服务端,尝试获取dubbo服务

使用 "zkCli.sh -server 127.0.0.1:2181" 命令连接到zookeeper。
输入 ls /dubbo 命令,结果报了错误


寻找报错的原因

去网上搜这个错误,很容易找到了报错原因和解决方式。
原因:zookeeper上注册的服务太多,超过了ZkClient缓存的大小。在ZkClient中有这么一段代码:

 ClientCnxn.Packet packet = this.queuePacket(h, r, request, response, (AsyncCallback)null, (String)null, (String)null, (Object)null, watchRegistration);
        synchronized(packet) {
            while(!packet.finished) {
                packet.wait();
            }

            return r;
        }

ZkClient缓存不够大,无法获取完数据,就一直wait()了。。。

解决方式

解决方式就是扩大ZkClient的缓存,有两种设置方法:

  1. jvm加入 "-Djute.maxbuffer=41943040" 参数(这个值是默认值的10倍了)
init {
        System.setProperty("jute.maxbuffer", (4096 * 1024 * 10).toString())
    }

当然如果Zookeeper上有大量无用的dubbo无法,可以考虑将它们删掉。。。

上一篇下一篇

猜你喜欢

热点阅读