From 8bc5e9c36ccfdbddaf88d1af9162eea5f284247a Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 14 Nov 2013 14:59:26 +0000 Subject: [PATCH] Refine semantics of server.port=0 If the server port is 0 it doesn't mean you don't want *any* container because there might still be servlet context aware components in the classpath. Better to try and stop the server from actually starting. This change is a step in the right direction: it prevents the server from starting in the start() method (even though for technical reasons it may have already been started and stopped in initialize()). N.B. Tomcat at least uses port=0 as a signal it should pick a random port. Pertty useful feature that we may want to capitalize on at some point (on the other hand having our own port scanner would be useful generally too). --- .../jetty/JettyEmbeddedServletContainer.java | 13 +++++++++++++ .../jetty/JettyEmbeddedServletContainerFactory.java | 5 +---- .../tomcat/TomcatEmbeddedServletContainer.java | 13 ++++++++++++- .../TomcatEmbeddedServletContainerFactory.java | 12 +++++++----- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java index 064af52dea0..de615ee44b6 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java @@ -33,12 +33,22 @@ import org.springframework.util.Assert; public class JettyEmbeddedServletContainer implements EmbeddedServletContainer { private final Server server; + private boolean autoStart; /** * Create a new {@link JettyEmbeddedServletContainer} instance. * @param server the underlying Jetty server */ public JettyEmbeddedServletContainer(Server server) { + this(server, true); + } + + /** + * Create a new {@link JettyEmbeddedServletContainer} instance. + * @param server the underlying Jetty server + */ + public JettyEmbeddedServletContainer(Server server, boolean autoStart) { + this.autoStart = autoStart; Assert.notNull(server, "Jetty Server must not be null"); this.server = server; initialize(); @@ -63,6 +73,9 @@ public class JettyEmbeddedServletContainer implements EmbeddedServletContainer { @Override public void start() throws EmbeddedServletContainerException { + if (!this.autoStart) { + return; + } try { this.server.start(); Connector[] connectors = this.server.getConnectors(); diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java index f60b725bd2d..0f0d111fb13 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java @@ -97,9 +97,6 @@ public class JettyEmbeddedServletContainerFactory extends public EmbeddedServletContainer getEmbeddedServletContainer( ServletContextInitializer... initializers) { WebAppContext context = new WebAppContext(); - if (getPort() == 0) { - return EmbeddedServletContainer.NONE; - } Server server = new Server(new InetSocketAddress(getAddress(), getPort())); if (this.resourceLoader != null) { @@ -243,7 +240,7 @@ public class JettyEmbeddedServletContainerFactory extends * @return a new {@link JettyEmbeddedServletContainer} instance */ protected JettyEmbeddedServletContainer getJettyEmbeddedServletContainer(Server server) { - return new JettyEmbeddedServletContainer(server); + return new JettyEmbeddedServletContainer(server, getPort() > 0); } @Override diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java index a2e1116cdc1..33f07447742 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java @@ -43,11 +43,22 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer private final Tomcat tomcat; + private boolean autoStart; + /** * Create a new {@link TomcatEmbeddedServletContainer} instance. * @param tomcat the underlying Tomcat server */ public TomcatEmbeddedServletContainer(Tomcat tomcat) { + this(tomcat, true); + } + + /** + * Create a new {@link TomcatEmbeddedServletContainer} instance. + * @param tomcat the underlying Tomcat server + */ + public TomcatEmbeddedServletContainer(Tomcat tomcat, boolean autoStart) { + this.autoStart = autoStart; Assert.notNull(tomcat, "Tomcat Server must not be null"); this.tomcat = tomcat; initialize(); @@ -90,7 +101,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer @Override public void start() throws EmbeddedServletContainerException { Connector connector = this.tomcat.getConnector(); - if (connector != null) { + if (connector != null && this.autoStart) { try { connector.getProtocolHandler().start(); } diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java index b285399ab48..6d9b15f4116 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java @@ -123,9 +123,6 @@ public class TomcatEmbeddedServletContainerFactory extends Connector connector; Tomcat tomcat = new Tomcat(); - if (getPort() == 0) { - return EmbeddedServletContainer.NONE; - } File baseDir = (this.baseDirectory != null ? this.baseDirectory : createTempDir("tomcat")); tomcat.setBaseDir(baseDir.getAbsolutePath()); @@ -195,7 +192,12 @@ public class TomcatEmbeddedServletContainerFactory extends // Needs to be protected so it can be used by subclasses protected void customizeConnector(Connector connector) { - connector.setPort(getPort()); + if (getPort() > 0) { + connector.setPort(getPort()); + } + else { + connector.setPort(8080); + } if (connector.getProtocolHandler() instanceof AbstractProtocol) { if (getAddress() != null) { ((AbstractProtocol) connector.getProtocolHandler()) @@ -256,7 +258,7 @@ public class TomcatEmbeddedServletContainerFactory extends */ protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer( Tomcat tomcat) { - return new TomcatEmbeddedServletContainer(tomcat); + return new TomcatEmbeddedServletContainer(tomcat, getPort() > 0); } private File createTempDir(String prefix) {