Commit 8bc5e9c3 authored by Dave Syer's avatar Dave Syer

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).
parent 11149443
...@@ -33,12 +33,22 @@ import org.springframework.util.Assert; ...@@ -33,12 +33,22 @@ import org.springframework.util.Assert;
public class JettyEmbeddedServletContainer implements EmbeddedServletContainer { public class JettyEmbeddedServletContainer implements EmbeddedServletContainer {
private final Server server; private final Server server;
private boolean autoStart;
/** /**
* Create a new {@link JettyEmbeddedServletContainer} instance. * Create a new {@link JettyEmbeddedServletContainer} instance.
* @param server the underlying Jetty server * @param server the underlying Jetty server
*/ */
public JettyEmbeddedServletContainer(Server 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"); Assert.notNull(server, "Jetty Server must not be null");
this.server = server; this.server = server;
initialize(); initialize();
...@@ -63,6 +73,9 @@ public class JettyEmbeddedServletContainer implements EmbeddedServletContainer { ...@@ -63,6 +73,9 @@ public class JettyEmbeddedServletContainer implements EmbeddedServletContainer {
@Override @Override
public void start() throws EmbeddedServletContainerException { public void start() throws EmbeddedServletContainerException {
if (!this.autoStart) {
return;
}
try { try {
this.server.start(); this.server.start();
Connector[] connectors = this.server.getConnectors(); Connector[] connectors = this.server.getConnectors();
......
...@@ -97,9 +97,6 @@ public class JettyEmbeddedServletContainerFactory extends ...@@ -97,9 +97,6 @@ public class JettyEmbeddedServletContainerFactory extends
public EmbeddedServletContainer getEmbeddedServletContainer( public EmbeddedServletContainer getEmbeddedServletContainer(
ServletContextInitializer... initializers) { ServletContextInitializer... initializers) {
WebAppContext context = new WebAppContext(); WebAppContext context = new WebAppContext();
if (getPort() == 0) {
return EmbeddedServletContainer.NONE;
}
Server server = new Server(new InetSocketAddress(getAddress(), getPort())); Server server = new Server(new InetSocketAddress(getAddress(), getPort()));
if (this.resourceLoader != null) { 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 * @return a new {@link JettyEmbeddedServletContainer} instance
*/ */
protected JettyEmbeddedServletContainer getJettyEmbeddedServletContainer(Server server) { protected JettyEmbeddedServletContainer getJettyEmbeddedServletContainer(Server server) {
return new JettyEmbeddedServletContainer(server); return new JettyEmbeddedServletContainer(server, getPort() > 0);
} }
@Override @Override
......
...@@ -43,11 +43,22 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer ...@@ -43,11 +43,22 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer
private final Tomcat tomcat; private final Tomcat tomcat;
private boolean autoStart;
/** /**
* Create a new {@link TomcatEmbeddedServletContainer} instance. * Create a new {@link TomcatEmbeddedServletContainer} instance.
* @param tomcat the underlying Tomcat server * @param tomcat the underlying Tomcat server
*/ */
public TomcatEmbeddedServletContainer(Tomcat tomcat) { 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"); Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat; this.tomcat = tomcat;
initialize(); initialize();
...@@ -90,7 +101,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer ...@@ -90,7 +101,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer
@Override @Override
public void start() throws EmbeddedServletContainerException { public void start() throws EmbeddedServletContainerException {
Connector connector = this.tomcat.getConnector(); Connector connector = this.tomcat.getConnector();
if (connector != null) { if (connector != null && this.autoStart) {
try { try {
connector.getProtocolHandler().start(); connector.getProtocolHandler().start();
} }
......
...@@ -123,9 +123,6 @@ public class TomcatEmbeddedServletContainerFactory extends ...@@ -123,9 +123,6 @@ public class TomcatEmbeddedServletContainerFactory extends
Connector connector; Connector connector;
Tomcat tomcat = new Tomcat(); Tomcat tomcat = new Tomcat();
if (getPort() == 0) {
return EmbeddedServletContainer.NONE;
}
File baseDir = (this.baseDirectory != null ? this.baseDirectory File baseDir = (this.baseDirectory != null ? this.baseDirectory
: createTempDir("tomcat")); : createTempDir("tomcat"));
tomcat.setBaseDir(baseDir.getAbsolutePath()); 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 // Needs to be protected so it can be used by subclasses
protected void customizeConnector(Connector connector) { protected void customizeConnector(Connector connector) {
connector.setPort(getPort()); if (getPort() > 0) {
connector.setPort(getPort());
}
else {
connector.setPort(8080);
}
if (connector.getProtocolHandler() instanceof AbstractProtocol) { if (connector.getProtocolHandler() instanceof AbstractProtocol) {
if (getAddress() != null) { if (getAddress() != null) {
((AbstractProtocol) connector.getProtocolHandler()) ((AbstractProtocol) connector.getProtocolHandler())
...@@ -256,7 +258,7 @@ public class TomcatEmbeddedServletContainerFactory extends ...@@ -256,7 +258,7 @@ public class TomcatEmbeddedServletContainerFactory extends
*/ */
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer( protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) { Tomcat tomcat) {
return new TomcatEmbeddedServletContainer(tomcat); return new TomcatEmbeddedServletContainer(tomcat, getPort() > 0);
} }
private File createTempDir(String prefix) { private File createTempDir(String prefix) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment