Java Tomcat,底层Netty线程未停止

5
我正在尝试使用log4j appender将日志发送到GrayLog2(log4j2-gelf)。 我将依赖项添加到我的pom.xml中并配置log4j2.xml来配置我的appender。 使用maven构建整个项目并将其部署到本地tomcat上,一切都很好。
问题出现在我尝试关闭tomcat时。如果我不使用kill -9 PID 来终止tomcat,它就无法停止,并且catalina.out会显示以下内容:完整的堆栈跟踪 引起我的注意的是:

java.lang.NoClassDefFoundError: io/netty/util/concurrent/DefaultPromise$1

起初,我以为可能有另一个依赖项导入了netty,从而导致此异常。但我寻找了一段时间,没有找到任何其他netty导入。然后我看到了这个:

Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [io.netty.buffer.PoolArena$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

这就是我的问题所在。我理解gelf appender使用Netty作为一种与GrayLog服务器异步通信的方式。但它本身也是一个服务器。那么,是否有可能Tomcat在终止底层Netty之前停止了父servlet?这会导致这个问题吗?我一直在寻找一些关于Tomcat关闭方式的文档,但到目前为止我没有找到任何东西,更不用说我的诊断可能完全错误了。

我进行了一些调查,似乎无法在Jetty中重现问题,因此这看起来是一个Tomcat问题。 - MaxouMask
1个回答

5

看起来你有一个ClassLoader问题

造成原因:java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [io.netty.buffer.PoolArena$1]. 以下堆栈跟踪是为了调试和尝试终止导致非法访问的线程。 at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1342)

WebappClassLoader当收到关闭信号时停止服务来加载传入的请求。你需要让Netty jar在WebappClassLoader之外可访问。将其放在$CATALINA_HOME/lib中(参见Tomcat ClassLoader Howto,共同部分)。如果你使用maven,请运行 mvn dependency:tree 找到正确的jar包。


它确实解决了问题。非常感谢,伙计! - MaxouMask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接