java - Tomcat关闭: class loading during contextDestroyed does not work

标签 java tomcat classloader shutdown

我正在 Tomcat 7.0.53 中运行 Web 应用程序。我实现了一个 ServletContextListener(将其称为 InitListener)并在 web.xml 中将其正确定义为监听器:

  <listener>
    <description>listener that initializes common web app/service resources</description>
    <listener-class>x.y.z.InitListener</listener-class>
  </listener>

在 contextDestroyed 事件期间,我想清理一些代码(例如,使用 close () 关闭 org.jboss.netty.channel.group.ChannelGroup),但我的代码在此方法中总是失败并出现错误:

SEVERE: Exception sending context destroyed event to listener instance of class x.y.z.InitListener
java.lang.NoClassDefFoundError: org/jboss/netty/util/internal/ConcurrentHashMap$Values

现在,如果我已经在 InitListener 的 contextInitialized 部分中使用了 ConcurrentHashMap$Values,例如,通过在 ChannelGroup 上调用 close () ,那么关闭就不会出现问题。

在我看来,在 contextDestroyed 事件期间,Tomcat 无法再加载该类,但如果它已预先加载,那就没有问题。但这不是解决方案,因为我在 contextDestroyed 中使用了其他类,但也存在同样的问题。我必须预先加载我稍后想要使用的所有类。对我来说听起来像是黑客。

我做错了什么?为什么 Tomcat 在这个阶段无法再加载新类?

编辑:作为附加信息,该问题仅在我远程部署 Web 应用程序时发生。当我在 Tomcat 上重新加载或取消部署 Web 应用程序时,它总是会正常关闭。就在远程部署时,关机失败。

最佳答案

我刚刚得到 Tomcat 开发人员的答复。正如 Gimby 已经假设的那样,问题是由于 Tomcat 中的错误造成的。它在 7.0.54 及更高版本中已修复。

感谢您的帮助。

关于java - Tomcat关闭: class loading during contextDestroyed does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466197/

相关文章:

java - android:整个应用程序的字体系列

javascript - CSS 和 Javascript 在 Tomcat 8 或 9 上加载时间过长

java - 来自扩展类加载类的类转换异常

java - EJB 的类加载器问题

java - 无法访问Java中的资源文件夹

java - 为什么我收到以下 Selenium "The path to the driver executable must be set by the webdriver.chrome.driver system property"错误

java - 从 J2ME 应用程序检测电源中断

java - 有人看到我的更新或插入查询有问题吗?我正在使用准备好的声明

apache - 为简单的 Spring MVC 应用程序在 Travis CI 上构建失败

java - JDBC 连接对象在 Servlet/Web 应用程序中返回 null