How to spring boot control tomcat cache?

I am migrating a 5 year Spring MVC application from JSP to Spring Download. Therefore, according to the sample in http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-jsp-limitations , I use the "war" package.

The built-in tomcat starts. However, the logs are filled with caching warnings, as in the example below

 2016-08-25 14: 59: 01.442 INFO 28884 --- [main] sbcetTomcatEmbeddedServletContainer: Tomcat initialized with port (s): 8080 (http)
 2016-08-25 14: 59: 01.456 INFO 28884 --- [main] o.apache.catalina.core.StandardService: Starting service Tomcat
 2016-08-25 14: 59: 01.458 INFO 28884 --- [main] org.apache.catalina.core.StandardEngine: Starting Servlet Engine: Apache Tomcat / 8.5.4
 2016-08-25 14: 59: 01.531 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/WEB-INF/lib/displaytag-1.2. jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 01.531 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/ WEB-INF / lib / decrex-maven- 0.1.10-SNAPSHOT.jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 01.531 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/ WEB-INF / lib / spring-boot- actuator-1.4.0.RELEASE.jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 01.531 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/ WEB-INF / lib / validation-api- 1.1.0.Final.jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 01.532 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/ WEB-INF / lib / lucene-backward- codecs-5.3.1.jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 01.532 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/ WEB-INF / lib / lucene-queries- 5.3.1.jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 .....
 2016-08-25 14: 59: 05.121 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/WEB-INF/lib/jstl-1.2. jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 05.139 WARN 28884 --- [ost-startStop-1] org.apache.catalina.webresources.Cache: Unable to add the resource at [/ WEB-INF / classes / commons-logging. properties] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
 2016-08-25 14: 59: 05.139 INFO 28884 --- [ost-startStop-1] oaccC [Tomcat]. [Localhost]. [/]: Initializing Spring embedded WebApplicationContext
 2016-08-25 14: 59: 05.139 INFO 28884 --- [ost-startStop-1] osweb.context.ContextLoader: Root WebApplicationContext: initialization completed in 7117 ms
 .....
 2016-08-25 15: 02: 03.960 INFO 28884 --- [ndardContext []]] org.apache.catalina.webresources.Cache: The background cache eviction process was unable to free [10] percent of the cache for Context [ ] - consider increasing the maximum size of the cache.  After eviction approximately [9,251] KB of data remained in the cache.

I would be happy to increase the tomcat cache, but I cannot find a way to control it in Spring Boot. Please advise !!!

<h / "> I tried the suggestion from Andy Wilkinson below. Also tried using it in the EmbeddedServletContainerCustomizer

 @Component
 public class ServletContainerCustomizer implements EmbeddedServletContainerCustomizer {

     private static final Log log = LogFactory.getLog (ServletContainerCustomizer.class);

     @Override
     public void customize (ConfigurableEmbeddedServletContainer container) {
         if (TomcatEmbeddedServletContainerFactory.class.isAssignableFrom (container.getClass ())) {

             int cacheSize = 256 * 1024;
             log.info ("Customizing tomcat factory. New cache size (KB) is" + cacheSize);

             TomcatEmbeddedServletContainerFactory tomcatFactory = (TomcatEmbeddedServletContainerFactory container;
             tomcatFactory.addContextCustomizers ((context) -> {
                 StandardRoot standardRoot = new StandardRoot (context);
                 standardRoot.setCacheMaxSize (cacheSize);
             });

         }
     }

 }

A message about resizing the cache is in the logs, but the code above does not affect warnings

+8
spring boot tomcat
source share
3 answers

I had the same problem, but Andy Wilkinson's hint put me on the right track. What worked for me was to set the cache, as Andy did, but then also explicitly set the resources in context.

 @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory() { @Override protected void postProcessContext(Context context) { final int cacheSize = 40 * 1024; StandardRoot standardRoot = new StandardRoot(context); standardRoot.setCacheMaxSize(cacheSize); context.setResources(standardRoot); // This is what made it work in my case. logger.info(String.format("New cache size (KB): %d", context.getResources().getCacheMaxSize())); } }; return tomcatFactory; } 

Hope this helps!

+8
source share

You can adjust the cache size using the context adapter to configure the context using the custom StandardRoot :

Java 7:

 @Bean public TomcatEmbeddedServletContainerFactory tomcatFactory() { TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory(); tomcatFactory.addContextCustomizers(new TomcatContextCustomizer() { @Override public void customize(Context context) { StandardRoot standardRoot = new StandardRoot(context); standardRoot.setCacheMaxSize(40 * 1024); } }); return tomcatFactory; } 

Java 8:

 @Bean public TomcatEmbeddedServletContainerFactory tomcatFactory() { TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory(); tomcatFactory.addContextCustomizers((context) -> { StandardRoot standardRoot = new StandardRoot(context); standardRoot.setCacheMaxSize(40 * 1024); }); return tomcatFactory; } 
+3
source share

Referring to the answer here , I created the src / main / webapp / META-INF / context.xml file and added the following.

 <?xml version="1.0" encoding="UTF-8"?> <Context> <Resources cachingAllowed="true" cacheMaxSize="204800" /> </Context> 
+1
source share

All Articles