Refactor random port in spring-websocket
Remove the use of SocketUtils#findAvailableTcpPort in favor of letting servers pick a dynamic port by specifying port 0.
This commit is contained in:
parent
c79092f0f9
commit
949bb55ef5
|
@ -41,7 +41,7 @@ public class JettyWebSocketTestServer implements WebSocketTestServer {
|
|||
|
||||
private Server jettyServer;
|
||||
|
||||
private int port = -1;
|
||||
private int port;
|
||||
|
||||
private ServletContextHandler contextHandler;
|
||||
|
||||
|
|
|
@ -22,8 +22,6 @@ import javax.servlet.Filter;
|
|||
import javax.servlet.ServletContext;
|
||||
|
||||
import org.apache.catalina.Context;
|
||||
import org.apache.catalina.LifecycleEvent;
|
||||
import org.apache.catalina.LifecycleListener;
|
||||
import org.apache.catalina.connector.Connector;
|
||||
import org.apache.catalina.startup.Tomcat;
|
||||
import org.apache.commons.logging.Log;
|
||||
|
@ -34,7 +32,6 @@ import org.apache.tomcat.util.descriptor.web.FilterMap;
|
|||
import org.apache.tomcat.websocket.server.WsContextListener;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.SocketUtils;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.servlet.DispatcherServlet;
|
||||
|
||||
|
@ -50,24 +47,22 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer {
|
|||
|
||||
private Tomcat tomcatServer;
|
||||
|
||||
private int port = -1;
|
||||
private int port;
|
||||
|
||||
private Context context;
|
||||
|
||||
|
||||
@Override
|
||||
public void setup() {
|
||||
this.port = SocketUtils.findAvailableTcpPort();
|
||||
|
||||
Connector connector = new Connector(Http11NioProtocol.class.getName());
|
||||
connector.setPort(this.port);
|
||||
connector.setPort(0);
|
||||
|
||||
File baseDir = createTempDir("tomcat");
|
||||
String baseDirPath = baseDir.getAbsolutePath();
|
||||
|
||||
this.tomcatServer = new Tomcat();
|
||||
this.tomcatServer.setBaseDir(baseDirPath);
|
||||
this.tomcatServer.setPort(this.port);
|
||||
this.tomcatServer.setPort(0);
|
||||
this.tomcatServer.getService().addConnector(connector);
|
||||
this.tomcatServer.setConnector(connector);
|
||||
}
|
||||
|
@ -117,12 +112,10 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer {
|
|||
@Override
|
||||
public void start() throws Exception {
|
||||
this.tomcatServer.start();
|
||||
this.context.addLifecycleListener(new LifecycleListener() {
|
||||
@Override
|
||||
public void lifecycleEvent(LifecycleEvent event) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Event: " + event.getType());
|
||||
}
|
||||
this.port = this.tomcatServer.getConnector().getLocalPort();
|
||||
this.context.addLifecycleListener(event -> {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Event: " + event.getType());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -130,6 +123,7 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer {
|
|||
@Override
|
||||
public void stop() throws Exception {
|
||||
this.tomcatServer.stop();
|
||||
this.port = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -17,6 +17,7 @@
|
|||
package org.springframework.web.socket;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.Servlet;
|
||||
|
@ -34,12 +35,12 @@ import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
|
|||
import org.xnio.OptionMap;
|
||||
import org.xnio.Xnio;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.SocketUtils;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.servlet.DispatcherServlet;
|
||||
|
||||
import static io.undertow.servlet.Servlets.*;
|
||||
import static io.undertow.servlet.Servlets.defaultContainer;
|
||||
import static io.undertow.servlet.Servlets.deployment;
|
||||
import static io.undertow.servlet.Servlets.servlet;
|
||||
|
||||
/**
|
||||
* Undertow-based {@link WebSocketTestServer}.
|
||||
|
@ -49,7 +50,7 @@ import static io.undertow.servlet.Servlets.*;
|
|||
*/
|
||||
public class UndertowTestServer implements WebSocketTestServer {
|
||||
|
||||
private int port = -1;
|
||||
private int port;
|
||||
|
||||
private Undertow server;
|
||||
|
||||
|
@ -58,13 +59,11 @@ public class UndertowTestServer implements WebSocketTestServer {
|
|||
|
||||
@Override
|
||||
public void setup() {
|
||||
this.port = SocketUtils.findAvailableTcpPort();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void deployConfig(WebApplicationContext wac, Filter... filters) {
|
||||
Assert.state(this.port != -1, "setup() was never called");
|
||||
DispatcherServletInstanceFactory servletFactory = new DispatcherServletInstanceFactory(wac);
|
||||
// manually building WebSocketDeploymentInfo in order to avoid class cast exceptions
|
||||
// with tomcat's implementation when using undertow 1.1.0+
|
||||
|
@ -85,7 +84,9 @@ public class UndertowTestServer implements WebSocketTestServer {
|
|||
.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, info);
|
||||
for (final Filter filter : filters) {
|
||||
String filterName = filter.getClass().getName();
|
||||
servletBuilder.addFilter(new FilterInfo(filterName, filter.getClass(), new FilterInstanceFactory(filter)).setAsyncSupported(true));
|
||||
FilterInstanceFactory filterFactory = new FilterInstanceFactory(filter);
|
||||
FilterInfo filterInfo = new FilterInfo(filterName, filter.getClass(), filterFactory);
|
||||
servletBuilder.addFilter(filterInfo.setAsyncSupported(true));
|
||||
for (DispatcherType type : DispatcherType.values()) {
|
||||
servletBuilder.addFilterUrlMapping(filterName, "/*", type);
|
||||
}
|
||||
|
@ -94,7 +95,7 @@ public class UndertowTestServer implements WebSocketTestServer {
|
|||
this.manager = defaultContainer().addDeployment(servletBuilder);
|
||||
this.manager.deploy();
|
||||
HttpHandler httpHandler = this.manager.start();
|
||||
this.server = Undertow.builder().addHttpListener(this.port, "localhost").setHandler(httpHandler).build();
|
||||
this.server = Undertow.builder().addHttpListener(0, "localhost").setHandler(httpHandler).build();
|
||||
}
|
||||
catch (ServletException ex) {
|
||||
throw new IllegalStateException(ex);
|
||||
|
@ -109,11 +110,14 @@ public class UndertowTestServer implements WebSocketTestServer {
|
|||
@Override
|
||||
public void start() throws Exception {
|
||||
this.server.start();
|
||||
Undertow.ListenerInfo info = this.server.getListenerInfo().get(0);
|
||||
this.port = ((InetSocketAddress) info.getAddress()).getPort();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() throws Exception {
|
||||
this.server.stop();
|
||||
this.port = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -31,7 +31,6 @@ import org.junit.Test;
|
|||
|
||||
import org.springframework.core.task.SimpleAsyncTaskExecutor;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.SocketUtils;
|
||||
import org.springframework.web.socket.WebSocketHandler;
|
||||
import org.springframework.web.socket.WebSocketHttpHeaders;
|
||||
import org.springframework.web.socket.WebSocketSession;
|
||||
|
@ -59,15 +58,13 @@ public class JettyWebSocketClientTests {
|
|||
@Before
|
||||
public void setup() throws Exception {
|
||||
|
||||
int port = SocketUtils.findAvailableTcpPort();
|
||||
|
||||
this.server = new TestJettyWebSocketServer(port, new TextWebSocketHandler());
|
||||
this.server = new TestJettyWebSocketServer(new TextWebSocketHandler());
|
||||
this.server.start();
|
||||
|
||||
this.client = new JettyWebSocketClient();
|
||||
this.client.start();
|
||||
|
||||
this.wsUrl = "ws://localhost:" + port + "/test";
|
||||
this.wsUrl = "ws://localhost:" + this.server.getPort() + "/test";
|
||||
}
|
||||
|
||||
@After
|
||||
|
@ -109,11 +106,11 @@ public class JettyWebSocketClientTests {
|
|||
private final Server server;
|
||||
|
||||
|
||||
public TestJettyWebSocketServer(int port, final WebSocketHandler webSocketHandler) {
|
||||
public TestJettyWebSocketServer(final WebSocketHandler webSocketHandler) {
|
||||
|
||||
this.server = new Server();
|
||||
ServerConnector connector = new ServerConnector(this.server);
|
||||
connector.setPort(port);
|
||||
connector.setPort(0);
|
||||
|
||||
this.server.addConnector(connector);
|
||||
this.server.setHandler(new org.eclipse.jetty.websocket.server.WebSocketHandler() {
|
||||
|
@ -140,6 +137,10 @@ public class JettyWebSocketClientTests {
|
|||
public void stop() throws Exception {
|
||||
this.server.stop();
|
||||
}
|
||||
|
||||
public int getPort() {
|
||||
return ((ServerConnector) this.server.getConnectors()[0]).getLocalPort();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue