ScheduledThreadPoolExecutor在web应用程序关闭后不会终止



在我的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应用程序时终止这个执行器/线程?

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

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

希望能有所帮助

线程池驻留在

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

所以你应该在退出应用程序时优雅地关闭执行器,否则后台线程可能会像僵尸一样无限期地继续运行🧟‍♂️。

<标题>雅加达并发h1> akarta Concurrency的应用服务器上。Jakarta Concurrency 2的规范是当前的,而Jakarta Concurrency 3目前正在开发中。

您只需要注释定义任务的类。服务器将自动检测您是否需要执行器服务。因此,当你的web应用程序启动时,服务器将自动处理创建执行器服务器,并在你的web应用程序结束时关闭执行器服务器及其后台线程。非常容易。

支持Jakarta Concurrency的产品包括Apache TomEE (Plume&加上版本),Payara, Glassfish, Open Liberty, WildFly, JBoss等。

ServletContextListener

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

Servlet规范为你的web应用程序的启动和退出定义了一个钩子。

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

两种方法分别是contextInitializedcontextDestroyed。在servlet语言中,"context"一词的意思是"你的web应用"。web容器可以运行任意数量的web应用程序。

在这两个方法中,您可以实例化执行器服务,然后关闭它。

通过编写类来实现接口。还必须将该类标记为容器。标记它的最简单方法是使用@WebListener注释。

这已经在Stack Overflow上讨论过很多次了。所以搜索更多的信息和例子。比如我的这个答案。

相关内容

  • 没有找到相关文章

最新更新