【问题标题】:ScheduledThreadPoolExecutor doesn’t terminate after the web application is closed关闭 Web 应用程序后,ScheduledThreadPoolExecutor 不会终止
【发布时间】:2021-11-11 14:24:11
【问题描述】:

在我的 Java Web 应用程序中,我使用 ScheduledThreadPoolExecutor 定期检查数据库连接状态。

final ScheduledExecutorService executor = Executors.newScheduledThreadPool(0);
       
Runnable task = new Runnable() {
     public void run() {
          //check the status of the database connection, and log the result
     }
};

        
executor.scheduleWithFixedDelay(task, 0, 10, TimeUnit.MINUTES);

但是,当我从 Web 应用程序注销并关闭浏览器窗口时,我(从日志中)看到它仍在检查连接状态。

有没有办法在关闭 Web 应用程序时终止这个执行器/线程?

【问题讨论】:

    标签: java jsp web threadpool java-threads


    【解决方案1】:

    我不确定是否完全理解了这个问题,但是在退出应用程序的部分中,您可能应该执行以下操作

    executor.shutdown();
        try { executor.awaitTermination(10, TimeUnit.SECONDS); } catch (InterruptedException e) { }
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。此代码在应用程序范围内使用,由于网页太多,我没有任何特定的代码块来检测/处理 Web 应用程序/浏览器窗口关闭事件。
    【解决方案2】:

    线程池继续存在

    执行器服务的线程池可以在其父应用程序结束后继续运行。这包括网络应用程序。

    因此,您应该始终在退出应用程序时优雅地关闭执行程序。否则后备线程可能会无限期地继续运行,就像僵尸?‍♂️。

    Jakarta 并发

    最简单的解决方案是将您的 Web 应用程序部署到支持 Jakarta Concurrency 的应用程序服务器。 Jakarta Concurrency 2 的规范是最新的,而 Jakarta Concurrency 3 正在开发中。

    您只需要对定义任务的类进行注释。服务器将自动检测您对执行程序服务的需求。因此,服务器将在您的 Web 应用程序启动时自动处理创建执行程序服务器,并在您的 Web 应用程序结束时关闭执行程序服务器及其支持线程。很简单。

    支持 Jakarta Concurrency 的产品包括 Apache TomEE (Plume & Plus editions)、Payara、Glassfish、Open Liberty、WildFly、JBoss 等。

    ServletContextListener

    如果部署到不支持 Jakarta Concurrency 的应用服务器,如 Apache Tomcat 或 Eclipse Jetty,则必须手动控制,并编写更多代码。

    Servlet 规范为您的 Web 应用程序的启动和退出定义了一个挂钩。

    那个钩子是ServletContextListener 接口。该接口需要一对方法,一个由 Servlet 容器在处理 Web 应用程序的第一个传入请求之前调用,另一个在发出最后一个响应后调用。规范要求每个 Servlet 容器(例如 Tomcat)在适当的时间调用这些方法。

    这对方法是contextInitializedcontextDestroyed。 Servlet 语言中的“上下文”一词的意思是“你的网络应用程序”。一个 Web 容器可以运行任意数量的 Web 应用程序。

    在这两种方法中,您可以实例化您的执行器服务,然后将其关闭。

    您通过编写一个类来实现接口。您还必须将该类标记到容器中。标记它的最简单方法是使用@WebListenerannotation。

    这已经在 Stack Overflow 上讨论过很多次了。因此,请搜索更多信息和示例。比如我的this Answer

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2015-07-03
      • 2020-11-24
      • 1970-01-01
      • 2016-08-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多