2016-11-12 17 views
2

最近、Tomcatで動作するWebアプリケーションからTomcatが埋め込まれたSpringブートアプリケーションにアプリケーションを移植しました。Springブート埋め込みのTomcatアプリケーションセッションで無効化されない

数日間アプリを実行した後、メモリとCPU使用率が100%に達しました。 ヒープ・ダンプ解析では、破棄されなかったHTTPセッション・オブジェクトが多数存在することが判明しました。

設定されたタイムアウト値で作成されたセッションでは、5分と表示されます。しかし、この時間が過ぎると、失効は引き起こされません。私はタイムアウト期間の後に再度要求する場合にのみ呼び出されます。

私のアプリは、Tomcatの中で実行されていると、この動作を比較していると私はそのセッションの無効化がContainerBackgroungProcessorスレッドによってトリガされ見ることができます[StandardManager(ManagerBase).processExpires()]

私は春ブーツで、このバックグラウンドスレッドが表示されません応用。

  1. application.propertiesに設定

    セッションタイムアウト: server.session.timout = 300 またはEmbeddedServletContainerCustomizer @Bean中: factory.setSessionTimout(5、TimeUnitで見つかったいくつかの提案、次の行われていた何

    .MINUTES)

  2. 追加HttpSessionEventPublisherとSessionRegistry豆

有効期限が切れてもセッションは無効になりません。

何か手掛かりがありますか?

答えて

2

これを読んでいくつかのより多くのデバッグやドキュメントが理由と解決された後:Tomcatので

、スレッドは定期コンテナとその子コンテナのセッションプールをスキャンし、それらを無効にルートコンテナに代わって生み出されています。各コンテナ/子コンテナは、ジョブを実行するか、ホストのバックグラウンドプロセッサに依存する独自のバックグラウンドプロセッサを持つように構成できます。 これはConext.backgroundProcessorDelay

Apache Tomcat 8 Configuration Reference

backgroundProcessorDelayによって制御 - この値は、すべてのホストを含​​む、このエンジン上のbackgroundProcessメソッドの呼び出しとその子コンテナとの間の遅延時間(秒)を表し
と文脈子コンテナは、遅延値が負でない場合(つまり、独自の処理スレッドを使用している場合)、呼び出されません。これを正の値に設定すると、スレッドが生成されます。指定された時間待機すると、スレッドはこのエンジンとすべての子コンテナでbackgroundProcessメソッドを呼び出します。指定しない場合、この属性のデフォルト値は10で、これは10秒の遅延を表します。埋め込みのTomcat 有するばねブートアプリケーションにおいて

は、このプロパティを設定TomcatEmbeddedServletContainerFactory.configureEngine()-1私は理解し、Tomcatの階層のルートコンテナであるStandardEngineで[Tomcatの]、のために存在します。 Webアプリケーションを含むすべての子コンテナにもこのパラメータが-1に設定されています。 これは、彼らが仕事をするために他の誰かに頼っていることを意味します。 春はやっていない、誰もやらない。

@Bean 
public EmbeddedServletContainerCustomizer servletContainerCustomizer() { 
    return new EmbeddedServletContainerCustomizer() { 

     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      if (container instanceof TomcatEmbeddedServletContainerFactory) { 
       TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container; 
       TomcatContextCustomizer contextCustomizer = new TomcatContextCustomizer() { 

        @Override 
        public void customize(Context context) { 
         context.setBackgroundProcessorDelay(10); 
        } 
       }; 
       List<TomcatContextCustomizer> contextCustomizers = new ArrayList<TomcatContextCustomizer>(); 
       contextCustomizers.add(contextCustomizer); 
       factory.setTomcatContextCustomizers(contextCustomizers); 
       customizeTomcat(factory); 
      } 
     } 

私のためのソリューションは、アプリケーションのコンテキストのため、このパラメータを設定することでした

関連する問題