前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决zookeeper导致tomcat停止时报异常的问题

解决zookeeper导致tomcat停止时报异常的问题

作者头像
jeremyxu
发布2018-05-10 17:50:25
6K0
发布2018-05-10 17:50:25
举报

问题由来

今天运行工程时,发现停止tomcat时,发现控制台会报一些错误。

代码语言:javascript
复制
十二月 09, 2016 9:25:14 上午 org.apache.coyote.AbstractProtocol stop
信息: Stopping ProtocolHandler ["http-apr-8080"]
十二月 09, 2016 9:25:14 上午 org.apache.catalina.loader.WebappClassLoaderBase loadClass
信息: Illegal access: this web application instance has been stopped already.  Could not load org.apache.zookeeper.server.ZooTrace.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1747)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1705)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1128)

十二月 09, 2016 9:25:14 上午 org.apache.catalina.loader.WebappClassLoaderBase loadClass
信息: Illegal access: this web application instance has been stopped already.  Could not load org.apache.log4j.spi.ThrowableInformation.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1747)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1705)
	at org.apache.log4j.spi.LoggingEvent.<init>(LoggingEvent.java:165)
	at org.apache.log4j.Category.forcedLog(Category.java:391)
	at org.apache.log4j.Category.log(Category.java:856)
	at org.slf4j.impl.Log4jLoggerAdapter.error(Log4jLoggerAdapter.java:576)
	at org.apache.zookeeper.ClientCnxn$1.uncaughtException(ClientCnxn.java:414)
	at java.lang.Thread.dispatchUncaughtException(Thread.java:1986)

分析原因

框架时使用CuratorFramework连接zookeeper的,在spring bean销毁时也正确的关闭了zookeeper连接。

1

curatorFramework.close();

但跟踪代码发现curatorFramework关闭时会调用org.apache.curator.CuratorZookeeperClient#close,之后会org.apache.curator.ConnectionState#close,再之后会调到org.apache.curator.HandleHolder#closeAndClear,再之后会调到org.apache.curator.HandleHolder#internalClose,再之后会调到org.apache.zookeeper.ZooKeeper#close,再之后会调到org.apache.zookeeper.ClientCnxn#close,再之后再调到org.apache.zookeeper.ClientCnxn#disconnect,再之后会调到org.apache.zookeeper.ClientCnxn.SendThread#close。

org/apache/zookeeper/ClientCnxn.java:1311

代码语言:javascript
复制
void close() {
    state = States.CLOSED;
    clientCnxnSocke.wakeupCnxn();
}

这样仅仅只是修改了SendThread线程内部的变量,并没有等SendThread完全退出。 这样就存在spring bean销毁了,但SendThread线程还活着的场景。spring容器退出后,tomcat将该web应用标识为stopped,该web应用的classloader也不再可用。这时SendThread线程执行时要从该web应用的classloader里加载类时,就会报上面的错。

解决方案

这个问题本质上应该是zookeeper-3.4.8.jar的bug, 关闭zookeeper时,并没有等待SendThread线程完全退出。但项目中不太好直接修改zookeeper的源码,因此从封装的框架层面解决此问题。

代码语言:javascript
复制
public synchronized void destroy() {
    try {
        if (nodepath != null) {
            curatorFramework.delete().forPath(nodepath);
            LOGGER.info("ZK Close,Path:{}", nodepath);
        }


    } catch (Exception e) {
        LOGGER.error("Couldn't Delete Registry Node", e);
    }

    try {
        curatorFramework.close();
        //等待zookeeper的相关线程完全退出
        synchronized (curatorFramework){
            curatorFramework.wait(500L);
        }
    } catch (Exception e){
        LOGGER.error("Close Registry Error", e);
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题由来
  • 分析原因
  • 解决方案
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档