【问题标题】:Call method on undeploy from a Java web-application从 Java Web 应用程序取消部署时调用方法
【发布时间】:2012-01-01 08:37:46
【问题描述】:

我正在开发一个 Java 网络应用程序。应用程序连接到 Lucene 索引。我创建了 IndexSearcher 的单例实例。此实例打开一些文件。当我重新部署 Web 应用程序时,由 IndexSearcher 的早期实例打开的文件继续保持打开状态,并且重新部署的应用程序会创建另一个实例。几次重新部署后,系统开始抛出“打开的文件过多”异常。我想在重新部署之前关闭旧实例,以便关闭旧文件,但我不知道该怎么做? web.xml 中是否有一个在取消部署时调用的指令,类似于启动时加载?我在 jboss 服务器上运行 web 应用程序。

【问题讨论】:

    标签: servlets jboss web.xml


    【解决方案1】:

    实现ServletContextListener

    @WebListener
    public class LuceneConfig implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent event) {
            // Do your job here during webapp startup.
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent event) {
            // Do your job here during webapp shutdown.
        }
    
    }
    

    如果您还没有使用 Servlet 3.0(虽然它已经发布了 2 年),那么您需要删除 @WebListener 注释并在 web.xml 中手动注册,如下所示:

    <listener>
        <listener-class>com.example.LuceneConfig</listener-class>
    </listener>
    

    【讨论】:

    • 无需注册即可在此处使用。在 Payara 4.1(173 build)上使用 Mojarra 2.3.3。
    • 当然可以。 Payara 4.x 基于 Servlet 3.1。然后@WebListener 就可以正常工作了。正如回答的那样,当您还没有使用 Servlet 3.0 时,它不会起作用。 JSF impl/version 无关紧要,因为它在这里不起作用。只有 Servlet 版本是相关的。
    【解决方案2】:

    如果您实现javax.servlet.ServletContextListener 并将web.xml 中的该类注册为&lt;listener&gt;,那么contextDestroyed() 方法将在上下文卸载之前被调用。

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2012-11-02
      • 1970-01-01
      • 2023-03-27
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多