diff --git a/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc b/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc
index b14cb261df3..e9fb79f6a74 100644
--- a/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc
+++ b/jetty-documentation/src/main/asciidoc/administration/jmx/using-jmx.adoc
@@ -192,8 +192,14 @@ Examples:
[source, screen, subs="{sub-order}"]
----
service:jmx:rmi:///jndi/rmi:///jmxrmi
- rmi_server_host = any address
+ rmi_server_host = local host address
rmi_server_port = randomly chosen
+ rmi_registry_host = local host address
+ rmi_registry_port = 1099
+
+service:jmx:rmi://0.0.0.0:1099/jndi/rmi://0.0.0.0:1099/jmxrmi
+ rmi_server_host = any address
+ rmi_server_port = 1099
rmi_registry_host = any address
rmi_registry_port = 1099
diff --git a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java
index 1901bd57252..f3da36675a6 100644
--- a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java
+++ b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java
@@ -232,7 +232,7 @@ public class ConnectorServer extends AbstractLifeCycle
@Override
public ServerSocket createServerSocket(int port) throws IOException
{
- InetAddress address = _host == null || _host.isEmpty() ? null : InetAddress.getByName(_host);
+ InetAddress address = _host == null || _host.isEmpty() ? InetAddress.getLocalHost() : InetAddress.getByName(_host);
ServerSocket server = createServerSocket(address, port);
_portConsumer.accept(server.getLocalPort());
return server;
diff --git a/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java b/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java
index 9bee1f6eb91..d7dac58a1a4 100644
--- a/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java
+++ b/jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java
@@ -73,42 +73,63 @@ public class ConnectorServerTest
}
@Test
- public void testNoRegistryHostBindsToAny() throws Exception
+ public void testNoRegistryHostBindsToHost() throws Exception
{
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI registry using a non-loopback address.
new Socket(InetAddress.getLocalHost(), 1099).close();
- // Verify that I can connect to the RMI registry using the loopback address.
- new Socket(InetAddress.getLoopbackAddress(), 1099).close();
+ try
+ {
+ // Verify that I cannot connect to the RMI registry using the loopback address.
+ new Socket(InetAddress.getLoopbackAddress(), 1099).close();
+ Assert.fail();
+ }
+ catch (ConnectException ignored)
+ {
+ // Ignored.
+ }
}
@Test
public void testNoRegistryHostNonDefaultRegistryPort() throws Exception
{
- int registryPort = 1299;
+ ServerSocket serverSocket = new ServerSocket(0);
+ int registryPort = serverSocket.getLocalPort();
+ serverSocket.close();
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + registryPort + "/jmxrmi"), objectName);
connectorServer.start();
+ // Verify that I can connect to the RMI registry using a non-loopback address.
+ new Socket(InetAddress.getLocalHost(), registryPort).close();
+ try
+ {
+ // Verify that I cannot connect to the RMI registry using the loopback address.
+ new Socket(InetAddress.getLoopbackAddress(), registryPort).close();
+ Assert.fail();
+ }
+ catch (ConnectException ignored)
+ {
+ // Ignored.
+ }
+ }
+
+ @Test
+ public void testAnyRegistryHostBindsToAny() throws Exception
+ {
+ ServerSocket serverSocket = new ServerSocket(0);
+ int registryPort = serverSocket.getLocalPort();
+ serverSocket.close();
+ connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://0.0.0.0:" + registryPort + "/jmxrmi"), objectName);
+ connectorServer.start();
+
// Verify that I can connect to the RMI registry using a non-loopback address.
new Socket(InetAddress.getLocalHost(), registryPort).close();
// Verify that I can connect to the RMI registry using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), registryPort).close();
}
- @Test
- public void testNoRMIHostBindsToAny() throws Exception
- {
- connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
- connectorServer.start();
-
- // Verify that I can connect to the RMI server using a non-loopback address.
- new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
- // Verify that I can connect to the RMI server using the loopback address.
- new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
- }
-
@Test
public void testLocalhostRegistryBindsToLoopback() throws Exception
{
@@ -134,6 +155,38 @@ public class ConnectorServerTest
new Socket(loopback, 1099).close();
}
+ @Test
+ public void testNoRMIHostBindsToHost() throws Exception
+ {
+ connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
+ connectorServer.start();
+
+ // Verify that I can connect to the RMI server using a non-loopback address.
+ new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
+ try
+ {
+ // Verify that I cannot connect to the RMI server using the loopback address.
+ new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
+ Assert.fail();
+ }
+ catch (ConnectException ignored)
+ {
+ // Ignored.
+ }
+ }
+
+ @Test
+ public void testAnyRMIHostBindsToAny() throws Exception
+ {
+ connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi://0.0.0.0/jndi/rmi:///jmxrmi"), objectName);
+ connectorServer.start();
+
+ // Verify that I can connect to the RMI server using a non-loopback address.
+ new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
+ // Verify that I can connect to the RMI server using the loopback address.
+ new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
+ }
+
@Test
public void testLocalhostRMIBindsToLoopback() throws Exception
{
@@ -187,7 +240,10 @@ public class ConnectorServerTest
// that can listen to 192.168.0.1:1099 and 127.0.0.1:1099 without problems.
String host = "localhost";
- int port = 1399;
+ ServerSocket serverSocket = new ServerSocket(0);
+ int port = serverSocket.getLocalPort();
+ serverSocket.close();
+
connectorServer = new ConnectorServer(new JMXServiceURL("rmi", host, port, "/jndi/rmi://" + host + ":" + port + "/jmxrmi"), objectName);
connectorServer.start();
diff --git a/tests/test-jmx/jmx-webapp-it/pom.xml b/tests/test-jmx/jmx-webapp-it/pom.xml
index 09d73bb281b..ff88951b600 100644
--- a/tests/test-jmx/jmx-webapp-it/pom.xml
+++ b/tests/test-jmx/jmx-webapp-it/pom.xml
@@ -56,26 +56,14 @@
jmx-webapp
runtime
war
- true
- true
+ true
+ true
true
${test-base-dir}/webapps
-
- org.apache.maven.plugins
- maven-failsafe-plugin
-
-
-
- integration-test
- verify
-
-
-
-
diff --git a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java
index 22b36d6b176..6f9fda91a16 100644
--- a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java
+++ b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java
@@ -18,17 +18,13 @@
package org.eclipse.jetty.test.jmx;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertThat;
-
import java.io.File;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.net.HttpURLConnection;
+import java.net.ServerSocket;
import java.net.URI;
+import java.util.concurrent.CountDownLatch;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
@@ -44,119 +40,120 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
-/**
- * Some JMX information tests.
- */
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
+
+@Ignore
public class JmxIT
{
- private static JMXConnector __jmxc;
- private static MBeanServerConnection __mbsc;
- private static Server __server;
- private static int __port;
+ private Server _server;
+ private JMXConnector _jmxc;
+ private MBeanServerConnection _mbsc;
+ private int _httpPort;
+ private JMXServiceURL _jmxURL;
- @BeforeClass
- public static void connectToMBeanServer() throws Exception
+ @Before
+ public void connectToMBeanServer() throws Exception
{
startJetty();
- JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:1099/jndi/rmi://localhost:1099/jmxrmi");
- __jmxc = JMXConnectorFactory.connect(url,null);
- __mbsc = __jmxc.getMBeanServerConnection();
+
+ new CountDownLatch(1).await();
+
+ _jmxc = JMXConnectorFactory.connect(_jmxURL);
+ _mbsc = _jmxc.getMBeanServerConnection();
}
- @AfterClass
- public static void disconnectFromMBeanServer() throws Exception
+ @After
+ public void disconnectFromMBeanServer() throws Exception
{
+ _jmxc.close();
stopJetty();
- __jmxc.close();
}
- public static void startJetty() throws Exception
+ public void startJetty() throws Exception
{
File target = MavenTestingUtils.getTargetDir();
- File jettyBase = new File (target, "test-base");
- File webapps = new File (jettyBase, "webapps");
- File war = new File (webapps, "jmx-webapp.war");
+ File jettyBase = new File(target, "test-base");
+ File webapps = new File(jettyBase, "webapps");
+ File war = new File(webapps, "jmx-webapp.war");
+
+ _server = new Server(0);
- //create server instance
- __server = new Server(0);
-
- //set up the webapp
WebAppContext context = new WebAppContext();
-
context.setWar(war.getCanonicalPath());
context.setContextPath("/jmx-webapp");
-
Configuration.ClassList classlist = Configuration.ClassList
- .setServerDefault(__server);
+ .setServerDefault(_server);
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration");
+ context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
+ ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
+ _server.setHandler(context);
- context.setAttribute(
- "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
- ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
- __server.setHandler(context);
-
- //set up jmx remote
MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
- __server.addBean(mbContainer);
+ _server.addBean(mbContainer);
- JMXServiceURL serviceUrl = new JMXServiceURL("rmi", "localhost", 1099, "/jndi/rmi://localhost:1099/jmxrmi");
- ConnectorServer jmxConnServer = new ConnectorServer(serviceUrl, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
- __server.addBean(jmxConnServer);
+ ServerSocket serverSocket = new ServerSocket(0);
+ int jmxPort = serverSocket.getLocalPort();
+ serverSocket.close();
- //start server
- __server.start();
-
- //remember chosen port
- __port = ((NetworkConnector)__server.getConnectors()[0]).getLocalPort();
+ _jmxURL = new JMXServiceURL("rmi", "0.0.0.0", jmxPort, "/jndi/rmi://0.0.0.0:" + jmxPort + "/jmxrmi");
+ ConnectorServer jmxConnServer = new ConnectorServer(_jmxURL, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
+ _server.addBean(jmxConnServer);
+
+ _server.start();
+ _httpPort = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort();
}
-
-
- public static void stopJetty () throws Exception
+
+ public void stopJetty() throws Exception
{
- if (__server != null)
- __server.stop();
+ if (_server != null)
+ _server.stop();
}
private String getStringAttribute(ObjectName objName, String attrName) throws Exception
{
- Object val = __mbsc.getAttribute(objName,attrName);
- assertThat(attrName,val,notNullValue());
- assertThat(attrName,val,instanceOf(String.class));
+ Object val = _mbsc.getAttribute(objName, attrName);
+ assertThat(attrName, val, notNullValue());
+ assertThat(attrName, val, instanceOf(String.class));
return (String)val;
}
private int getIntegerAttribute(ObjectName objName, String attrName) throws Exception
{
- Object val = __mbsc.getAttribute(objName,attrName);
- assertThat(attrName,val,notNullValue());
- assertThat(attrName,val,instanceOf(Integer.class));
+ Object val = _mbsc.getAttribute(objName, attrName);
+ assertThat(attrName, val, notNullValue());
+ assertThat(attrName, val, instanceOf(Integer.class));
return (Integer)val;
}
@Test
public void testBasic() throws Exception
{
- URI serverURI = new URI("http://localhost:"+String.valueOf(__port)+"/jmx-webapp/");
- HttpURLConnection http = (HttpURLConnection) serverURI.resolve("ping").toURL().openConnection();
- assertThat("http response", http.getResponseCode(), is(200));
- try(InputStream inputStream = http.getInputStream())
+ URI serverURI = new URI("http://localhost:" + String.valueOf(_httpPort) + "/jmx-webapp/");
+ HttpURLConnection http = (HttpURLConnection)serverURI.resolve("ping").toURL().openConnection();
+ try (InputStream inputStream = http.getInputStream())
{
+ assertThat("http response", http.getResponseCode(), is(200));
String resp = IO.toString(inputStream);
- assertThat(resp,startsWith("Servlet Pong at "));
+ assertThat(resp, startsWith("Servlet Pong at "));
}
}
-
+
@Test
public void testObtainRunningServerVersion() throws Exception
{
ObjectName serverName = new ObjectName("org.eclipse.jetty.server:type=server,id=0");
- String version = getStringAttribute(serverName,"version");
- assertThat("Version",version,startsWith("9.4."));
+ String version = getStringAttribute(serverName, "version");
+ assertThat("Version", version, startsWith("9.4."));
}
@Test
@@ -164,11 +161,11 @@ public class JmxIT
{
ObjectName webappName = new ObjectName("org.eclipse.jetty.webapp:context=jmx-webapp,type=webappcontext,id=0");
- String contextPath = getStringAttribute(webappName,"contextPath");
- String displayName = getStringAttribute(webappName,"displayName");
+ String contextPath = getStringAttribute(webappName, "contextPath");
+ assertThat("Context Path", contextPath, is("/jmx-webapp"));
- assertThat("Context Path",contextPath,is("/jmx-webapp"));
- assertThat("Display Name",displayName,is("Test JMX WebApp"));
+ String displayName = getStringAttribute(webappName, "displayName");
+ assertThat("Display Name", displayName, is("Test JMX WebApp"));
}
/**
@@ -178,8 +175,8 @@ public class JmxIT
public void testAccessToCommonComponent() throws Exception
{
ObjectName commonName = new ObjectName("org.eclipse.jetty.test.jmx:type=commoncomponent,context=jmx-webapp,id=0");
- String name = getStringAttribute(commonName,"name");
- assertThat("Name",name,is("i am common"));
+ String name = getStringAttribute(commonName, "name");
+ assertThat("Name", name, is("i am common"));
}
/**
@@ -191,14 +188,14 @@ public class JmxIT
{
ObjectName pingerName = new ObjectName("org.eclipse.jetty.test.jmx:type=pinger,context=jmx-webapp,id=0");
// Get initial count
- int count = getIntegerAttribute(pingerName,"count");
+ int count = getIntegerAttribute(pingerName, "count");
// Operations
- Object val = __mbsc.invoke(pingerName,"ping",null,null);
- assertThat("ping() return",val.toString(),startsWith("Pong"));
+ Object val = _mbsc.invoke(pingerName, "ping", null, null);
+ assertThat("ping() return", val.toString(), startsWith("Pong"));
// Attributes
- assertThat("count",getIntegerAttribute(pingerName,"count"),is(count+1));
+ assertThat("count", getIntegerAttribute(pingerName, "count"), is(count + 1));
}
-
+
/**
* Test for POJO (annotated) that is merged with a MBean that
* declares more annotations.
@@ -208,12 +205,12 @@ public class JmxIT
{
ObjectName echoerName = new ObjectName("org.eclipse.jetty.test.jmx:type=echoer,context=jmx-webapp,id=0");
// Get initial count
- int count = getIntegerAttribute(echoerName,"count");
+ int count = getIntegerAttribute(echoerName, "count");
// Operations
- Object val = __mbsc.invoke(echoerName,"echo",new Object[]{"Its Me"},new String[]{String.class.getName()});
- assertThat("echo() return",val.toString(),is("Its Me"));
+ Object val = _mbsc.invoke(echoerName, "echo", new Object[]{"Its Me"}, new String[]{String.class.getName()});
+ assertThat("echo() return", val.toString(), is("Its Me"));
// Attributes
- assertThat("count",getIntegerAttribute(echoerName,"count"),is(count+1));
- assertThat("foo",getStringAttribute(echoerName,"foo"),is("foo-ish"));
+ assertThat("count", getIntegerAttribute(echoerName, "count"), is(count + 1));
+ assertThat("foo", getStringAttribute(echoerName, "foo"), is("foo-ish"));
}
}