提交 0b5f2a87 authored 作者: Thomas Mueller's avatar Thomas Mueller

TCP and PG server: if the default port is already in use, the services are now…

TCP and PG server: if the default port is already in use, the services are now started on another free port (unless the port is explicitly set). This allows to start the H2 Console even if the TCP or PG servers are already running.
上级 5e0d2afd
...@@ -54,6 +54,7 @@ public class TcpServer implements Service { ...@@ -54,6 +54,7 @@ public class TcpServer implements Service {
private static final Map<Integer, TcpServer> SERVERS = Collections.synchronizedMap(new HashMap<Integer, TcpServer>()); private static final Map<Integer, TcpServer> SERVERS = Collections.synchronizedMap(new HashMap<Integer, TcpServer>());
private int port; private int port;
private boolean portIsSet;
private boolean trace; private boolean trace;
private boolean ssl; private boolean ssl;
private boolean stop; private boolean stop;
...@@ -169,6 +170,7 @@ public class TcpServer implements Service { ...@@ -169,6 +170,7 @@ public class TcpServer implements Service {
ssl = true; ssl = true;
} else if (Tool.isOption(a, "-tcpPort")) { } else if (Tool.isOption(a, "-tcpPort")) {
port = Integer.decode(args[++i]); port = Integer.decode(args[++i]);
portIsSet = true;
} else if (Tool.isOption(a, "-tcpPassword")) { } else if (Tool.isOption(a, "-tcpPassword")) {
managementPassword = args[++i]; managementPassword = args[++i];
} else if (Tool.isOption(a, "-baseDir")) { } else if (Tool.isOption(a, "-baseDir")) {
...@@ -216,7 +218,15 @@ public class TcpServer implements Service { ...@@ -216,7 +218,15 @@ public class TcpServer implements Service {
public synchronized void start() throws SQLException { public synchronized void start() throws SQLException {
stop = false; stop = false;
serverSocket = NetUtils.createServerSocket(port, ssl); try {
serverSocket = NetUtils.createServerSocket(port, ssl);
} catch (DbException e) {
if (!portIsSet) {
serverSocket = NetUtils.createServerSocket(0, ssl);
} else {
throw e;
}
}
port = serverSocket.getLocalPort(); port = serverSocket.getLocalPort();
initManagementDb(); initManagementDb();
} }
......
...@@ -20,6 +20,7 @@ import java.util.Collections; ...@@ -20,6 +20,7 @@ import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.h2.engine.Constants; import org.h2.engine.Constants;
import org.h2.message.DbException;
import org.h2.server.Service; import org.h2.server.Service;
import org.h2.util.NetUtils; import org.h2.util.NetUtils;
import org.h2.util.New; import org.h2.util.New;
...@@ -72,6 +73,7 @@ public class PgServer implements Service { ...@@ -72,6 +73,7 @@ public class PgServer implements Service {
private HashSet<Integer> typeSet = New.hashSet(); private HashSet<Integer> typeSet = New.hashSet();
private int port = PgServer.DEFAULT_PORT; private int port = PgServer.DEFAULT_PORT;
private boolean portIsSet;
private boolean stop; private boolean stop;
private boolean trace; private boolean trace;
private ServerSocket serverSocket; private ServerSocket serverSocket;
...@@ -89,6 +91,7 @@ public class PgServer implements Service { ...@@ -89,6 +91,7 @@ public class PgServer implements Service {
trace = true; trace = true;
} else if (Tool.isOption(a, "-pgPort")) { } else if (Tool.isOption(a, "-pgPort")) {
port = Integer.decode(args[++i]); port = Integer.decode(args[++i]);
portIsSet = true;
} else if (Tool.isOption(a, "-baseDir")) { } else if (Tool.isOption(a, "-baseDir")) {
baseDir = args[++i]; baseDir = args[++i];
} else if (Tool.isOption(a, "-pgAllowOthers")) { } else if (Tool.isOption(a, "-pgAllowOthers")) {
...@@ -160,7 +163,16 @@ public class PgServer implements Service { ...@@ -160,7 +163,16 @@ public class PgServer implements Service {
} }
public void start() { public void start() {
serverSocket = NetUtils.createServerSocket(port, false); try {
serverSocket = NetUtils.createServerSocket(port, false);
} catch (DbException e) {
if (!portIsSet) {
serverSocket = NetUtils.createServerSocket(0, false);
} else {
throw e;
}
}
port = serverSocket.getLocalPort();
} }
public void listen() { public void listen() {
......
...@@ -73,6 +73,7 @@ public class TestTools extends TestBase { ...@@ -73,6 +73,7 @@ public class TestTools extends TestBase {
return; return;
} }
org.h2.Driver.load(); org.h2.Driver.load();
testTcpServerWithoutPort();
testConsole(); testConsole();
testJdbcDriverUtils(); testJdbcDriverUtils();
testWrongServer(); testWrongServer();
...@@ -99,6 +100,23 @@ public class TestTools extends TestBase { ...@@ -99,6 +100,23 @@ public class TestTools extends TestBase {
IOUtils.delete(getBaseDir() + "/b2.zip"); IOUtils.delete(getBaseDir() + "/b2.zip");
} }
private void testTcpServerWithoutPort() throws Exception {
Server s1 = Server.createTcpServer().start();
Server s2 = Server.createTcpServer().start();
assertTrue(s1.getPort() != s2.getPort());
s1.stop();
s2.stop();
s1 = Server.createTcpServer("-tcpPort", "9123").start();
assertEquals(9123, s1.getPort());
try {
s2 = Server.createTcpServer("-tcpPort", "9123").start();
fail();
} catch (SQLException e) {
assertEquals(ErrorCode.EXCEPTION_OPENING_PORT_2, e.getErrorCode());
}
s1.stop();
}
private void testConsole() throws Exception { private void testConsole() throws Exception {
String old = System.getProperty(SysProperties.H2_BROWSER); String old = System.getProperty(SysProperties.H2_BROWSER);
Console c = new Console(); Console c = new Console();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论