原创

Tomcat报org/apache/zookeeper/proto/SetWatches异常解决办法

web服务可以正常访问执行,但是log日志一直打印“java.lang.NoClassDefFoundError: org/apache/zookeeper/proto/ConnectRequest”异常信息,该类问题肯定需要想办法解决的。起初NoClassDefFoundError这个异常,本人理解缺少包、类或者jar包冲突原因导致的,但是服务器一直跑着很正常,这个类是ZK的核心jar包,之前正常不会没有jar包。经过仔细NoClassDefFoundErrorClassNotFoundException异常是有区别的。


ClassNotFoundException产生的原因:

Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。


NoClassDefFoundError产生的原因:

JVM或ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到。这个错误往往是使用new操作符来创建一个新的对象但却找不到该对象的对应类,此时就会会导致NoClassDefFoundError


测试环境上,某web应用异常日志信息具体如下:

[QC] WARN [localhost-startStop-1-SendThread(hyxdl-db-test:2181)] org.apache.zookeeper.ClientCnxn$SendThread.run(1162) | Session 0x16344ae9b48000d for server hyxdl-db-test/192.168.200.248:2181, unexpected error, closing socket connection and attempting reconnect
java.lang.NoClassDefFoundError: org/apache/zookeeper/proto/SetWatches
at org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:926)
at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:363)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)


总结分析:

java.lang.NoClassDefFoundError: org/apache/zookeeper/proto/SetWatches的原因是由于应用程序没有正常启动,而zkClient线程在应用程序进程启动失败前已经正常启动,所以导致zkClient在jvm中没有找到SetWatches类。


解决办法:

1)使用命令查找java进程,具体命令“ps -ef | grep java”,发现同一服务启动了多个程序进程,也就是说前一个启动失败挂起状态,最后一个启动成功,所以导致web服务可以正常访问服务。同时62021或72843程序进程也在不停往log日志中循环输出,这种原因肯定是之前进程没有kill掉,又启动了新的程序进程。

2)使用“kill -9 72843 && kill -9 62021”命令杀死进程,重新启动该程序就可以了,日志就不会再打印org/apache/zookeeper/proto/SetWatches异常信息了。

关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

评论

分享:

支付宝

微信