Java 什么时候调用ContextDestroy?

Java 什么时候调用ContextDestroy?,java,tomcat,servletcontextlistener,Java,Tomcat,Servletcontextlistener,实现了ContextListener之后,我现在可以通过关闭连接池和刷新缓存等方式愉快地处理contextdestromed事件 我很惊讶最近在我的服务器没有关闭的时候调用了contextdestromed——似乎是在某个我无法追踪的任意时间 是否有任何已定义的事件或情况集触发contextdestromed 我是否应该确保调用contextdestromed时所做的一切都是可逆的?我是否需要使我的所有池在销毁/初始化的周期中生存?当Tomcat被关闭或我的war被替换时,我是否错误地认为我只会

实现了
ContextListener
之后,我现在可以通过关闭连接池和刷新缓存等方式愉快地处理
contextdestromed
事件

我很惊讶最近在我的服务器没有关闭的时候调用了
contextdestromed
——似乎是在某个我无法追踪的任意时间

是否有任何已定义的事件或情况集触发
contextdestromed

我是否应该确保调用
contextdestromed
时所做的一切都是可逆的?我是否需要使我的所有池在
销毁/初始化的
周期中生存?当Tomcat被关闭或我的
war
被替换时,我是否错误地认为我只会得到一个
contextdestromed

contextDestroyed(ServletContextEvent sce):接收以下通知: ServletContext即将关闭


也就是说,在卸载web应用程序时会调用它(例如,从web应用程序文件夹中删除或替换.war文件,或者使用Tomcat服务器管理器卸载它)。

通过一系列的试错测试,我发现当

  • 服务器是
    。WAR
    正在更新/删除
  • 由于管理员的干预,服务器已关闭
  • 由于编码错误,服务器已关闭。会 终止非服务器应用程序终止

  • 如果您遇到问题#3,正如您所建议的,我认为最好的做法是安全地(确保不要创建无限循环)调用
    contextInitialized()
    ,以确保正确地重新创建池。

    我想这是来自标记@KayamanAh的
    ServletContextListener
    ,是的,我没有查看标记。这里的关键是它实际上是
    ServletContext
    而不是
    ServerContext
    。当服务器停机时,所有servlet上下文肯定都会被销毁,但这并不意味着servlet上下文在其他时间(例如长时间未使用时)就不能被销毁。您使用的是哪台服务器?您可以通过参数控制销毁。Servlet生命周期允许容器删除上下文,例如回收资源,因此最好检查Tomcat是否允许您控制行为。ServletContext是“MyWebappContext”,而不仅仅是一个Servlet。理论上,J2EE服务器可以卸载空闲的web应用程序,但我没有遇到任何问题。但是,您可以在不重新启动应用程序服务器的情况下启动webapp重新部署。编辑mywebapp/web-inf/*文件,管理面板重新启动单击,在运行时复制或删除新的mywebapp/web-inf/lib/*.jar文件,删除或替换webapps/mywebapp.war文件。大多数J2EE服务器都支持这种热部署。@Whome-如果我删除.war,在Tomcat清理之前,我会得到一个
    contextdestromed
    。在一个新的.war中复制会干净地重新启动一切,而我却活了下来,因为我所有的单例池都被重新创建了。我的问题是,我现在发现我可以(很少)在不刷新静态数据的情况下获得
    contextdestromed
    ,这会导致各种损坏,我必须重新启动Tomcat才能恢复。谢谢你的帖子,但我的问题是关于可以调用
    contextdestromed
    的任何其他情况。我无法重现这个问题,但从内存中我看到,由于Tomcat中的类装入器异常,在循环中调用了
    contextdestromed
    。我找不到任何具体的合同,明确说明何时调用
    contectdestromed
    ,只有您引用的合同指定了一种情况,并且没有进一步说明。有趣的一点3-您是如何在测试中导致这种情况的?遗憾的是,我的连接池创建速度不快,为了以防万一,很难在
    contextdestromed
    上重建它们。。。我破译了密码。我“故意”引入了一个SQL查询,如果没有有效的
    ResultSet
    ,它将无法
    next()
    ,并抛出一个
    NullPointerException
    ,从而导致程序终止,而不会终止Tomcat进程。我假设您的错误与SQL无关,但这些是我的发现。我还将假设,由于这个问题已经提出将近一年了,你已经解决了这个问题。实际上,我无法解决它-这是一个我避免的独特情况。问题归结为库版本错误导致的类加载器崩溃,因此我删除了导致问题的依赖项。谢谢你的宝贵经验。@glend你说的关机是什么意思?通过使用./catalina.sh在终端中停止?我还没有机会在eclipse设置之外进行测试。我使用的是ServletContextListener,其代码在上下文“initialized”和“destromed”中运行。但是当我主动停止服务器时,“destromed”方法中的代码似乎没有运行(eclipse中按下了小红方块)。我知道它会在列表中出现第1点时运行:更新/删除。因为它写出了一个简单的sysout。对原因有什么想法吗?这可能是我的日食设置吗?@brat,对不起,我很久没有对tomcat做任何事情了。我不记得了。尝试创建另一个问题或尝试将某些内容发布到日志中。