之前一直正常启动的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的缓存,有两种设置方法:
- jvm加入 "-Djute.maxbuffer=41943040" 参数(这个值是默认值的10倍了)
init {
System.setProperty("jute.maxbuffer", (4096 * 1024 * 10).toString())
}
当然如果Zookeeper上有大量无用的dubbo无法,可以考虑将它们删掉。。。
网友评论