当前位置: 首页 > 知识库问答 >
问题:

在WebApp中优雅地关闭ExecutorService?

祁飞飙
2023-03-14

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

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

All在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所以线程已经谈到了这一点,但我找不到一个干净的方法来处理这一点。

我是否应该使用shutdownhook,就像@tim-bender建议的那样,在优雅地关闭线程和执行器?还是应该使用CachedThreadPool?

共有1个答案

皇甫逸清
2023-03-14

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

>

  • 关闭池太晚(在关闭时),Tomcat已经警告您没有关闭资源

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

  •  类似资料:
    • 优雅关闭,包括两部分,一个是 RPC 框架作为客户端,一个是 RPC 框架作为服务端。 作为服务端 作为服务端的时候,RPC 框架在关闭时,不应该直接暴力关闭。在 RPC 框架中 com.alipay.sofa.rpc.context.RpcRuntimeContext 在静态初始化块中,添加了一个 ShutdownHook // 增加jvm关闭事件 if (RpcConf

    • Dorado的优雅关闭通过ShutDownHook方式实现,调用端和服务端通过添加hook进行资源的清理和关闭 protected synchronized void addShutDownHook() { if (hook == null) { hook = new ShutDownHook(this); Runtime.getRuntime().addS

    • 在这种情况下,优雅地关闭WebSocket的正确方法是什么?

    • Graceful shutdown When you deploy a new version of your application, you must replace the previous version. The process manager you’re using will first send a SIGTERM signal to the application to noti

    • 我正在将FlinkKafkaConsumer010与Flink 1.2.0一起使用,我面临的问题是:如果出现某种情况,是否有办法通过编程关闭整个管道? 一种可能的解决方案是,我可以通过调用FlinkKafkaConsumer010中定义的close()方法关闭kafka消费源,然后调用带有shutdown的管道。对于这种方法,我创建了一个列表,其中包含对所有FlinkKafkaConsumer01

    • 我有一个Tornado和装饰器,允许对处理程序进行分块流式处理。 在允许流式传输之前,我需要执行身份验证和其他一些检查。我试图在方法中实现这些,但是当我使用向处理程序传输数据时,检查失败,连接突然关闭,我看到一个异常: 我的方法如下: 如何确保请求正常关闭,以便在检查失败时向客户端返回错误消息?