Browse Source

Fix OoM error when starting Tomcat with max int load on startup

Fixes gh-17927
pull/18464/head
Andy Wilkinson 7 years ago
parent
commit
abe3d38527
  1. 3
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TomcatEmbeddedContext.java
  2. 15
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java

3
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TomcatEmbeddedContext.java

@ -71,8 +71,7 @@ class TomcatEmbeddedContext extends StandardContext { @@ -71,8 +71,7 @@ class TomcatEmbeddedContext extends StandardContext {
Wrapper wrapper = (Wrapper) child;
int order = wrapper.getLoadOnStartup();
if (order >= 0) {
grouped.computeIfAbsent(order, ArrayList::new);
grouped.get(order).add(wrapper);
grouped.computeIfAbsent(order, (o) -> new ArrayList<>()).add(wrapper);
}
}
return grouped.values().stream().flatMap(List::stream);

15
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java

@ -519,6 +519,21 @@ public class TomcatServletWebServerFactoryTests extends AbstractServletWebServer @@ -519,6 +519,21 @@ public class TomcatServletWebServerFactoryTests extends AbstractServletWebServer
() -> factory.getWebServer((context) -> context.addListener(new FailingServletContextListener())));
}
@Test
public void registerJspServletWithDefaultLoadOnStartup() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(0);
factory.addInitializers(new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addServlet("manually-registered-jsp-servlet", JspServlet.class);
}
});
this.webServer = factory.getWebServer();
this.webServer.start();
}
@Override
protected JspServlet getJspServlet() throws ServletException {
Tomcat tomcat = ((TomcatWebServer) this.webServer).getTomcat();

Loading…
Cancel
Save