我在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应用程序时,它总是正常关闭。就在远程部署期间,关闭失败。
答案 0 :(得分:2)
我刚收到Tomcat开发人员的回答。正如Gimby已经假设的那样,问题是由于Tomcat中的一个错误。它已在7.0.54及更高版本中修复。
感谢您的帮助。