Browse Source

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).
pull/118/merge
Dave Syer 12 years ago
parent
commit
8bc5e9c36c
  1. 13
      spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java
  2. 5
      spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java
  3. 13
      spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java
  4. 12
      spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java

13
spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java

@ -33,12 +33,22 @@ import org.springframework.util.Assert; @@ -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 { @@ -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();

5
spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java

@ -97,9 +97,6 @@ public class JettyEmbeddedServletContainerFactory extends @@ -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 @@ -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

13
spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java

@ -43,11 +43,22 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer @@ -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 @@ -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();
}

12
spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java

@ -123,9 +123,6 @@ public class TomcatEmbeddedServletContainerFactory extends @@ -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 @@ -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 @@ -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) {

Loading…
Cancel
Save