Servlets 如何在servlet取消部署时销毁Akka(不仅仅是参与者)创建的线程?

Servlets 如何在servlet取消部署时销毁Akka(不仅仅是参与者)创建的线程?,servlets,akka,shutdown,spray,Servlets,Akka,Shutdown,Spray,我正在使用。在Tomcat7上部署并运行这个servlet之后,我取消了部署(以后可能再次部署)而不重新启动servlet容器(因此基本上JVM实例被保留) 问题在于,当servlet未部署时(即Akka关闭时),Akka在每个servlet部署时创建的线程不会被破坏,并且在每个部署时都会创建一组新的线程。因此泄漏 调用system.shutdown()和system.shutdown()是没有用的 有没有办法杀死servlet初始化时产生的线程 以下是来自Tomcat7的示例日志条目: SEV

我正在使用。在Tomcat7上部署并运行这个servlet之后,我取消了部署(以后可能再次部署)而不重新启动servlet容器(因此基本上JVM实例被保留)

问题在于,当servlet未部署时(即Akka关闭时),Akka在每个servlet部署时创建的线程不会被破坏,并且在每个部署时都会创建一组新的线程。因此泄漏

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

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

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

SEVERE:web应用程序[/…]创建了一个ThreadLocal,其密钥类型为[java.lang.ThreadLocal](值为[java.lang]。ThreadLocal@68871741])和类型为[scala.concurrent.forkjoin.ForkJoinPool.Submitter]的值](值[scala.concurrent.forkjoin.ForkJoinPool$Submitter@155aa3ef])但在web应用程序停止时无法删除它。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。

2013年11月14日下午1:53:24 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks

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

如果您使用的是Scala API,我已经为此创建了一个PR:

干杯


Tulio

system.shutdown()
应该是正确的工具。你叫它的时候发生了什么?泄漏的线程在做什么?调用将立即运行
system.shutdown()
并继续执行,对创建的线程没有任何影响(它们仍在运行)。在调用
system.shutdown()
之后立即调用
system.awaitTermination()
,将无限期挂起。有趣的是,线程挂起的确切位置(请尝试
jstack
)?除此之外,您可能还需要检查容器设置,这些设置会禁用您在上面包含的消息的检查:ForkJoinPool似乎没有清除其所有ThreadLocals。请更新到最新的稳定Akka版本,我们最近修复了一些与远程处理相关的线程泄漏。我的目标不是删除消息,而是删除问题。如果我删除生成消息的检查,那么在取消部署后线程将在那里,对吗?