Акка не закрывается в сервлете

1

Я разрабатываю веб-приложение на основе сервлетов в Scala и использую 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

Если я попытаюсь использовать обычный синхронный сервлет, я не получаю сообщения в журнале при завершении работы.

У сервлета есть слушатель контекста, который выглядит следующим образом:

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... и параллелизм, и в результате я не уверен, куда идти отсюда.

  • 0
    используйте jstack <pid>, чтобы получить список потоков, которые висят вокруг, оттуда мы можем выяснить, что делать с каждым из них
Теги:
servlets
akka
concurrency

2 ответа

1

Ключ к вашей проблеме заключается в этой строке журнала

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 от GCing webapp при выгрузке webapp.

Преступником является DynamicVariable, класс scala, который обертывает ThreadLocal. Чтобы удалить эту ошибку, вам нужно будет отследить, кто использует этот код, и очистить его. Если это ответственный код akka, попробуйте перейти на более позднюю версию, и если проблема все еще продолжается, рассмотрите вопрос о внесении патча в команду akka.

Tomcat документирует свои протоколы защиты от утечки памяти здесь.

1

Попробуйте установить в application.conf

akka {
  daemonic=on
}

Как и в этом вопросе - у меня была та же проблема, и это помогло

  • 0
    Я добавил значение конфигурации, но это никак не повлияло. Как я могу быть уверен, что он загружен?
  • 0
    Я не уверен, если вы пересобрали / перепаковали приложение, оно должно "просто работать"
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню