2017-11-14 9 views
2

下のポストで説明したように、私は同様の問題を持っている:アッカTomcatの問題

10-Nov-2017 09:47:56.517 SEVERE [main] 

org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [akka.actor.ActorCell$$anon$1] (value [[email protected]]) and a value of type [scala.collection.immutable.Nil$] (value [List()]) 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. 
10-Nov-2017 09:47:56.517 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [akka.actor.ActorCell$$anon$1] (value [[email protected]]) and a value of type [scala.collection.immutable.Nil$] (value [List()]) 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. 
10-Nov-2017 09:47:56.535 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"] 
10-Nov-2017 09:47:56.538 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"] 
10-Nov-2017 09:47:56.540 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"] 
10-Nov-2017 09:47:56.541 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"] 

をとTomcatが立ち往生している - それをシャットダウンする:

https://groups.google.com/d/msg/akka-user/Lp2hn4FfhU8/6a1EZVCmJpQJ

Tomcatをシャットダウンし、私が着いたとき完全に私はそのプロセスを殺す必要があります。 私は上記の記事で述べたように同様のソリューションを試してみました(私はアッカ2.5.6使用するので、何のシャットダウンが(ありません)とawaitTermination()メソッドはもう):

@Override 
public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    ActorSystem actorSystem = (ActorSystem) WebApplicationContextUtils.getRequiredWebApplicationContext(servletContextEvent.getServletContext()).getBean("my-actor-system"); 
    try { 
     Await.result((Awaitable) actorSystem.terminate(), Duration.create(10, TimeUnit.SECONDS)); 
    } catch (Exception e) { 
     logger.warning(e.getMessage()); 
    } 
} 

しかし、それは全く役に立ちません。 Beanは簡単な方法で作成されます。

@Bean 
public ActorSystem actorSystem() { 
    return ActorSystem.create("my-actor-system"); 
} 

アイデアをお持ちですか?

バージョン仕様:
のTomcat 9.0.1
アッカ2.5.6
春4.2.3

+0

私は答えはありませんが、少なくとも同じ問題があります。あなたは一人ではありません:-) –

+0

ハ、感謝の仲間。私は私の回避策を掲載しているので、多分あなたのために役立つでしょう。 –

答えて

0

私は誰かが役に立つかもしれ回避策を、把握するために管理しています。私は知っているが、それは適切な解決策ではないので、すべての "クリーナー" ソリューションはまだ歓迎されている

ServletContextListenerでActorSystemを作成して破棄すると、正常に動作します。だから、最終的に私はこれでデフォルトのリスナーをオーバーライド:

private static ActorSystem actorSystem; 

@Override 
public void contextInitialized(ServletContextEvent servletContextEvent) { 
    actorSystem = ActorSystem.create("my-actor-system"); 
} 

@Override 
public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    try { 
     Await.result((Awaitable) actorSystem.terminate(), Duration.create(10, TimeUnit.SECONDS)); 
    } catch (Exception e) { 
     logger.warning(e.getMessage()); 
    } 
} 

public static ActorSystem getActorSystem() { 
    return actorSystem; 
} 

は、次に設定で、私はちょうど上のgetterメソッドを呼び出しActorSystem豆、作成:

@Bean 
public ActorSystem actorSystem() { 
    return MyServletContextListener.getActorSystem(); 
} 

を私はアッカ2.5.6を使用することに、注意してください。古いバージョンでは、ActorSystemを別の方法で終了する必要があります(もしそうなら、actorSystem.terminate()メソッドはありません)。