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).
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user