Tomcat关闭:contextDestroyed期间的类加载不起作用

时间:2014-10-20 12:53:34

标签: java tomcat classloader shutdown

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

  <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应用程序时,它总是正常关闭。就在远程部署期间,关闭失败。

1 个答案:

答案 0 :(得分:2)

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

感谢您的帮助。