gpt4 book ai didi

servlets - 如何在 servlet 取消部署时销毁 Akka(不仅仅是 actor)创建的线程?

转载 作者:行者123 更新时间:2023-12-02 19:59:30 25 4
gpt4 key购买 nike

我正在使用a simple Spray-based servlet 。在 Tomcat7 上部署并运行此 servlet 后,我​​取消部署它(之后可能会再次部署它),无需重新启动 servlet 容器(因此基本上保留了 JVM 实例)。

问题在于,当 servled 取消部署(即 Akka 关闭时)并且设置时,Akka 在每个 servlet 部署时创建的线程不会被销毁每次部署时都会创建线程数。因此...泄漏

调用system.shutdown()system.awaitTermination()是没有用的。

有没有办法杀死这些在 servlet 初始化时产生的线程?

以下是 Tomcat7 的示例日志条目:

严重:Web应用程序[/...]创建了一个ThreadLocal,其键类型为[java.lang.ThreadLocal](值[java.lang.ThreadLocal@68871741]),值类型为[scala] .concurrent.forkjoin.ForkJoinPool.Submitter] (值 [scala.concurrent.forkjoin.ForkJoinPool$Submitter@155aa3ef]),但在 Web 应用程序停止时无法将其删除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。
十一月 14, 2013 1:53:24 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks

最佳答案

您是否尝试过在 ServletContextListener#contextDestroyed() 处调用 system.shutdown() 和 system.awaitTermination() ?在继续取消部署应用程序之前,这应该会清除所有资源。

如果您使用 Scala API,我已为此创建了一个 PR:https://github.com/spray/spray/pull/787

干杯

图里奥

关于servlets - 如何在 servlet 取消部署时销毁 Akka(不仅仅是 actor)创建的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19975530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com