2016-11-12 83 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); 
      } 
     } 
相关问题