在webapp中优雅地关闭ExecutorService?

     2023-02-19     73

关键词:

【中文标题】在webapp中优雅地关闭ExecutorService?【英文标题】:Shutdown ExecutorService gracefully in webapp? 【发布时间】:2012-09-30 16:53:59 【问题描述】:

在我的 web 应用程序中,我创建了一个使用具有固定大小线程池的 ExecutorService 的服务。我在整个应用程序生命周期内重复使用相同的ExecutorService

private static ExecutorService pool = Executors.newFixedThreadPool(8);

所有都在 Tomcat 中运行,关闭时出现以下错误:

appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.

我确实意识到在关闭 tomcat 之前我需要关闭 ExecutorService。 Soms SO线程已经谈到了这个,但我找不到一个干净的方法来处理这个。

我应该按照Graceful shutdown of threads and executor 中建议的@Tim-bender 使用ShutdownHook 吗?还是应该改用 CachedThreadPool?

【问题讨论】:

【参考方案1】:

关闭挂钩在 Tomcat 中不是一个好方法,因为:

它会太晚关闭池(关闭时),Tomcat 已经警告您未关闭的资源

您实际上希望在取消部署应用程序时关闭该池,以便重新部署工作(否则每个应用程序将创建新池,并且它们都将仅在完全关闭时关闭)

关闭线程池可能需要一些时间(见下文),关闭钩子应该尽可能快

更好的地方是ServletContextListener.contextDestroyed()。请记住,您必须同时 shutdownNow() 池(取消运行并拒绝新任务)和 awaitTermination() 等待已经运行的任务完成并停止所有线程。

【讨论】:

正是我需要知道的【参考方案2】:

除了 Tomasz 的建议,您还可以使用 CachedThreadPool

60 秒内未使用的线程将被终止并从缓存中删除。因此,闲置时间足够长的池不会消耗任何资源

所以一个非常好的解决方案是使用CachedThreadPool 并在ServletContextListener.contextDestroyed() 中关闭它。

【讨论】:

为啥 Spring Context 没有优雅地关闭?

】为啥SpringContext没有优雅地关闭?【英文标题】:WhySpringContextnotgracefullyclosed?为什么SpringContext没有优雅地关闭?【发布时间】:2013-05-0402:02:30【问题描述】:在基于Springframework3.0.5的Web应用程序的stop或undeploy/redeploy上,在Tomcat7\... 查看详情

优雅地中止 FileStream 写入循环

】优雅地中止FileStream写入循环【英文标题】:GracefullyabortFileStreamwriteloop【发布时间】:2013-03-2421:01:26【问题描述】:我有一个使用FileStream将数据写入文件的循环。在操作过程中,我想中止。如果我刷新并关闭它,我将在磁盘上... 查看详情

在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关闭工作人员

】在Celery工作人员中捕获HerokuSIGTERM以优雅地关闭工作人员【英文标题】:CaptureHerokuSIGTERMinCeleryworkerstoshutdownworkergracefully【发布时间】:2015-07-0413:31:38【问题描述】:我对此进行了大量研究,但我很惊讶我还没有在任何地方找到... 查看详情

如果优雅地关闭executorservice提供的java线程池

ExecutorService让我们可以优雅地在程序中使用线程池来创建和管理线程,而且性能佳、开销小,还可以有效地控制最大并发线程数,是我们在java并发编程中会经常使用到的。每一个线程都会占用系统资源,因此线程池的关闭与清... 查看详情

如何在 Netty 中的 ssl 握手之前优雅地关闭频道?

】如何在Netty中的ssl握手之前优雅地关闭频道?【英文标题】:HowtocloseachannelgracefullybeforesslhandshakeinNetty?【发布时间】:2018-03-0805:42:38【问题描述】:我在我的应用程序中添加了一个限制功能,当传入的请求率超过阈值时,它需... 查看详情

如何在tomcat上优雅地关闭ActiveMQ会话线程

】如何在tomcat上优雅地关闭ActiveMQ会话线程【英文标题】:HowtoshutdownActiveMQsessionthreadgracefullyontomcat【发布时间】:2017-01-0215:05:09【问题描述】:我们如何优雅地关闭守护线程[ActiveMQSession:ID:PC-63704-1472105244157-1:1:1]?我们有一个基... 查看详情

Pub\Sub Python 客户端 - 优雅地关闭订阅者

】Pub\\\\SubPython客户端-优雅地关闭订阅者【英文标题】:Pub\\SubPythonClient-GracefullyshutdownsubscriberPub\\SubPython客户端-优雅地关闭订阅者【发布时间】:2021-04-2123:13:23【问题描述】:我在python3.6中使用GooglePub/Sub客户端v2.2.0作为订阅者... 查看详情

如何优雅地关闭资源(代码片段)

很多时候我们都会用到io资源,比如文件、网络、各种连接等。比如有时候我们需要从一个文本文件中读取数据,一般的步骤是:用FileReader打开文件包装成BufferReader循环地从BufferReader中读取内容,直接读出来的内容为空关闭Buffer... 查看详情

如何优雅地关闭 Android 应用程序中的所有活动并关闭所有正在运行的线程?

】如何优雅地关闭Android应用程序中的所有活动并关闭所有正在运行的线程?【英文标题】:HowtogracefullyshutdownallactivitiesandcloseallrunningthreadsinanAndroidapp?【发布时间】:2019-06-2022:44:11【问题描述】:目前,在我的每一项活动中,我... 查看详情

优雅地关闭节点实例,不中途停止任何事情

】优雅地关闭节点实例,不中途停止任何事情【英文标题】:Closenodeinstancegracefully,withoutstoppinganythinghalf-way【发布时间】:2016-06-1415:03:00【问题描述】:请注意,这个问题不是关于在进程崩溃时保持进程运行,或者在完成新部署... 查看详情

Spring Boot 优雅地关闭应用程序

】SpringBoot优雅地关闭应用程序【英文标题】:Springbootshutdownapplicationgracefully【发布时间】:2021-10-2822:17:35【问题描述】:优雅关闭springboot应用程序的最佳方法是什么(Springboot-2.4.9版本)?我应该注册关闭挂钩吗?applicationContext... 查看详情

如何优雅地关闭 ASP.Net(非核心)

】如何优雅地关闭ASP.Net(非核心)【英文标题】:HowtoGracefullyShutDownASP.Net(notCore)【发布时间】:2021-03-3114:54:45【问题描述】:我有一个托管在IIS中的WCF服务应用程序。启动时,它从web.config读取SQL连接信息并连接到SQLServer以获取... 查看详情

stop tomcat web application 优雅地关闭所有 servlet 连接

】stoptomcatwebapplication优雅地关闭所有servlet连接【英文标题】:stoptomcatwebapplicationgracefullyshutdownallservletconnections【发布时间】:2012-06-1409:33:41【问题描述】:我们想要创建数据库的备份,但需要知道所有连接都在我们的Web应用程... 查看详情

java进阶知识点3:更优雅地关闭资源-try-with-resource语法

我们知道,在Java编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们。因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保... 查看详情

Delphi - 优雅地关闭服务中创建的进程。 (使用 tprocess / createProcess)

】Delphi-优雅地关闭服务中创建的进程。(使用tprocess/createProcess)【英文标题】:Delphi-GracefullyClosingCreatedProcessinService.(usingtprocess/createProcess)【发布时间】:2008-11-0610:19:53【问题描述】:我有一个用Delphi编写的Windows服务,它运行... 查看详情

如何优雅地关闭异步服务器套接字? C#

】如何优雅地关闭异步服务器套接字?C#【英文标题】:HowtogracefullycloseanAsyncServerSocket?C#【发布时间】:2013-10-0720:39:44【问题描述】:我已经看到很多关于在没有对象处理异常的情况下处理套接字的问题,所以我决定尝试一下... 查看详情

完成端口怎么优雅地关闭socket

参考技术A把shutdown换成CancelIo((HANDLE)m_socket)试试 查看详情

如何优雅地关闭猫鼬的连接池?

】如何优雅地关闭猫鼬的连接池?【英文标题】:HowdoIgracefullyshutdownmongoose\'sconnectionpool?【发布时间】:2019-06-2701:38:21【问题描述】:如果我收到SIGINT/SIGTERM(例如ctrl+c),那么我必须优雅地停止我的应用程序并关闭与mongodb服务... 查看详情