2016-11-12 49 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爲StandardEngine [Tomcat的],這是在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); 
      } 
     } 
相關問題