Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Akka未在Servlet中完全关闭_Java_Scala_Servlets_Concurrency_Akka - Fatal编程技术网

Java Akka未在Servlet中完全关闭

Java Akka未在Servlet中完全关闭,java,scala,servlets,concurrency,akka,Java,Scala,Servlets,Concurrency,Akka,我正在Scala中开发一个基于Servlet的web应用程序,并使用Akka。当它启动和运行时,一切都很好,我在查看代码时没有看到任何错误,我的孩子演员都会正确地启动和关闭自己。然而;当我尝试关闭服务器或重新部署时,控制台中会出现很多错误: Shutting down... Shut down successfully. 27-Mar-2015 11:21:22.233 SEVERE [localhost-startStop-2] org.apache.catalina.loader.Webap

我正在Scala中开发一个基于Servlet的web应用程序,并使用Akka。当它启动和运行时,一切都很好,我在查看代码时没有看到任何错误,我的孩子演员都会正确地启动和关闭自己。然而;当我尝试关闭服务器或重新部署时,控制台中会出现很多错误:

Shutting down...
Shut down successfully.
27-Mar-2015 11:21:22.233 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@68d6d1aa]) and a value of type [scala.concurrent.forkjoin.ForkJoinPool.Submitter] (value [scala.concurrent.forkjoin.ForkJoinPool$Submitter@1045f98]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
27-Mar-2015 11:21:22.233 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [scala.util.DynamicVariable$$anon$1] (value [scala.util.DynamicVariable$$anon$1@5f818593]) and a value of type [org.apache.tomcat.util.log.SystemLogHandler] (value [org.apache.tomcat.util.log.SystemLogHandler@5b616a23]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
27-Mar-2015 11:21:22.241 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
27-Mar-2015 11:21:22.243 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
27-Mar-2015 11:21:22.244 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
27-Mar-2015 11:21:22.244 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]
Disconnected from server
如果我尝试使用一个常规的同步servlet,那么在关机时我不会在日志中获取消息

我在servlet上有一个上下文侦听器,如下所示:

class ContextListener extends ServletContextListener {
    private var system: ActorSystem = _

    override def contextInitialized(sce: ServletContextEvent): Unit = {
        val context = sce.getServletContext

        system = ActorSystem.create("StridentStandard")

        context.setAttribute("actor.system", system)
    }

    override def contextDestroyed(sce: ServletContextEvent): Unit = {
        println("Shutting down...")
        system.shutdown()
        system.awaitTermination()
        println("Shut down successfully.")
    }
}
因此,从外观上看,ActorSystem应该正确关闭,但似乎有些线程仍在运行


我对Scala和Akka都是新手。。。和并发性,因此我真的不确定从这里走到哪里。

尝试在application.conf中进行设置

akka {
  daemonic=on
}

如中所示-我也遇到了同样的问题,这有助于

解决您的问题的关键在于此日志行

27-Mar-2015 11:21:22.233 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [scala.util.DynamicVariable$$anon$1] (value [scala.util.DynamicVariable$$anon$1@5f818593]) and a value of type [org.apache.tomcat.util.log.SystemLogHandler] (value [org.apache.tomcat.util.log.SystemLogHandler@5b616a23]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
在webapp卸载时,Tomcat收到了太多关于资源泄漏的报告,这些报告是由webapp而不是Tomcat容器引起的,因此他们实施了此检查。错误不是报告akka线程已保持运行,而是未清除ThreadLocal中存储的值。这将防止JVM在卸载webapp时GCing webapp

罪魁祸首是DynamicVariable,一个包装ThreadLocal的scala类。要删除此错误,您需要跟踪使用此代码的用户并使其自行清理。如果是AKKA代码负责,那么尝试升级到一个后来的版本,如果问题仍然继续,考虑向AKKA团队提交补丁。< /P>
Tomcat记录了他们的内存泄漏保护协议。

我添加了配置值,但没有任何效果。我怎么能确定它被加载了呢?我不确定,如果你重建/重新打包了应用程序,它应该“正常工作”嗯,我已经检查了配置值是否被加载了,但是没有任何区别。使用jstack获得一个挂起的线程列表,从那里我们可以知道如何处理每个线程