【问题标题】:Java Tomcat, underlying Netty threads not stoppedJava Tomcat,底层 Netty 线程没有停止
【发布时间】:2016-12-02 11:09:51
【问题描述】:

我正在尝试使用 log4j appender 将日志发送到 GrayLog2 (log4j2-gelf)。所以我将我的依赖添加到我的pom.xml 配置log4j2.xml 来配置我的appender。用maven构建整个东西并将其部署到本地tomcat,一切正常。 当我尝试关闭 tomcat 时会出现问题。 如果我不 kill -9 PID tomcat 和 catalina.out 结束,Tomcat 不会停止:Complete stack trace

引起我注意的是

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

首先我认为我可能有另一个依赖导入 netty 会导致此异常。但我找了一段时间,没能找到任何其他的净进口。然后我看到了:

原因:java.lang.ClassNotFoundException:非法访问:此网站 应用程序实例已经停止。不能加载 [io.netty.buffer.PoolArena$1]。抛出以下堆栈跟踪 调试目的以及尝试终止线程 导致非法访问。

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

【问题讨论】:

  • 我正在挖掘,似乎无法重现 Jetty 的问题,所以这看起来像是一个 tomcat 问题

标签: java multithreading tomcat log4j2 graylog2


【解决方案1】:

您似乎遇到了 ClassLoader 问题

原因:java.lang.ClassNotFoundException:非法访问:此 Web 应用程序实例已被停止。不能加载 [io.netty.buffer.PoolArena$1]。抛出以下堆栈跟踪 调试目的以及尝试终止线程 造成非法访问。 在 org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1342)

WebappClassLoader 在收到关闭信号时停止处理传入的加载请求。您需要在WebappClassLoader 之外访问 Netty jar。将其发送至$CATALINA_HOME/lib(请参阅Tomcat classloader howto, section Common)。要找到正确的 jar,请为您的 webapp 运行 mvn dependency:tree(如果您使用 maven)

【讨论】:

  • 它确实解决了这个问题。非常感谢队友!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2017-02-05
  • 2016-06-30
  • 2016-08-31
  • 2013-02-28
相关资源
最近更新 更多