美文网首页
记录一次因为ZkClient项目无法正常启动的问题

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

作者: ToufuDrago_c53f | 来源:发表于2019-10-03 11:32 被阅读0次

    之前一直正常启动的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无法,可以考虑将它们删掉。。。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/eqddpctx.html