diff options
author | Simone Bordet | 2015-08-13 13:16:14 +0000 |
---|---|---|
committer | Simone Bordet | 2015-08-13 13:16:14 +0000 |
commit | 69b90ef59b46e2675fdfdbc0e897bbb09ea0a0e4 (patch) | |
tree | 948809673b44e5c169617a28d43de8d45f601f54 /jetty-client | |
parent | 4c7d5f661ed50c19934dbd4a0cb6c3772b4262c2 (diff) | |
download | org.eclipse.jetty.project-69b90ef59b46e2675fdfdbc0e897bbb09ea0a0e4.tar.gz org.eclipse.jetty.project-69b90ef59b46e2675fdfdbc0e897bbb09ea0a0e4.tar.xz org.eclipse.jetty.project-69b90ef59b46e2675fdfdbc0e897bbb09ea0a0e4.zip |
474888 - HttpClient JMX support.
Diffstat (limited to 'jetty-client')
7 files changed, 72 insertions, 13 deletions
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java b/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java index cc6040ec7f..e4335979ea 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java @@ -31,10 +31,13 @@ import org.eclipse.jetty.io.SelectChannelEndPoint; import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.io.ssl.SslClientConnectionFactory; import org.eclipse.jetty.util.Promise; +import org.eclipse.jetty.util.annotation.ManagedAttribute; +import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; +@ManagedObject public abstract class AbstractHttpClientTransport extends ContainerLifeCycle implements HttpClientTransport { protected static final Logger LOG = Log.getLogger(HttpClientTransport.class); @@ -59,6 +62,12 @@ public abstract class AbstractHttpClientTransport extends ContainerLifeCycle imp this.client = client; } + @ManagedAttribute(value = "The number of selectors", readonly = true) + public int getSelectors() + { + return selectors; + } + @Override protected void doStart() throws Exception { diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java index 463bda30b5..ef9bad9e17 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java @@ -33,12 +33,15 @@ import org.eclipse.jetty.client.api.Destination; import org.eclipse.jetty.util.BlockingArrayQueue; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Promise; +import org.eclipse.jetty.util.annotation.ManagedAttribute; +import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.component.Dumpable; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.thread.Sweeper; +@ManagedObject("The connection pool") public class ConnectionPool implements Closeable, Dumpable, Sweeper.Sweepable { protected static final Logger LOG = Log.getLogger(ConnectionPool.class); @@ -60,11 +63,24 @@ public class ConnectionPool implements Closeable, Dumpable, Sweeper.Sweepable this.activeConnections = new BlockingArrayQueue<>(maxConnections); } + @ManagedAttribute(value = "The number of connections", readonly = true) public int getConnectionCount() { return connectionCount.get(); } + @ManagedAttribute(value = "The number of idle connections", readonly = true) + public int getIdleConnectionCount() + { + return idleConnections.size(); + } + + @ManagedAttribute(value = "The number of active connections", readonly = true) + public int getActiveConnectionCount() + { + return activeConnections.size(); + } + public BlockingQueue<Connection> getIdleConnections() { return idleConnections; diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java index 650f1103ab..845527b336 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java @@ -62,6 +62,8 @@ import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Jetty; import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.SocketAddressResolver; +import org.eclipse.jetty.util.annotation.ManagedAttribute; +import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -106,6 +108,7 @@ import org.eclipse.jetty.util.thread.Scheduler; * }); * </pre> */ +@ManagedObject("The HTTP client") public class HttpClient extends ContainerLifeCycle { private static final Logger LOG = Log.getLogger(HttpClient.class); @@ -503,11 +506,13 @@ public class HttpClient extends ContainerLifeCycle } else { + addManaged(destination); if (LOG.isDebugEnabled()) LOG.debug("Created {}", destination); } + if (!isRunning()) - destinations.remove(origin); + removeDestination(destination); } } @@ -516,6 +521,7 @@ public class HttpClient extends ContainerLifeCycle protected boolean removeDestination(HttpDestination destination) { + removeBean(destination); return destinations.remove(destination.getOrigin()) != null; } @@ -594,6 +600,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return the max time, in milliseconds, a connection can take to connect to destinations */ + @ManagedAttribute("The timeout, in milliseconds, for connect() operations") public long getConnectTimeout() { return connectTimeout; @@ -634,6 +641,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return the max time, in milliseconds, a connection can be idle (that is, without traffic of bytes in either direction) */ + @ManagedAttribute("The timeout, in milliseconds, to close idle connections") public long getIdleTimeout() { return idleTimeout; @@ -688,6 +696,7 @@ public class HttpClient extends ContainerLifeCycle * @return whether this {@link HttpClient} follows HTTP redirects * @see Request#isFollowRedirects() */ + @ManagedAttribute("Whether HTTP redirects are followed") public boolean isFollowRedirects() { return followRedirects; @@ -753,6 +762,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return the max number of connections that this {@link HttpClient} opens to {@link Destination}s */ + @ManagedAttribute("The max number of connections per each destination") public int getMaxConnectionsPerDestination() { return maxConnectionsPerDestination; @@ -777,6 +787,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return the max number of requests that may be queued to a {@link Destination}. */ + @ManagedAttribute("The max number of requests queued per each destination") public int getMaxRequestsQueuedPerDestination() { return maxRequestsQueuedPerDestination; @@ -803,6 +814,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return the size of the buffer used to write requests */ + @ManagedAttribute("The request buffer size") public int getRequestBufferSize() { return requestBufferSize; @@ -819,6 +831,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return the size of the buffer used to read responses */ + @ManagedAttribute("The response buffer size") public int getResponseBufferSize() { return responseBufferSize; @@ -853,6 +866,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return whether TCP_NODELAY is enabled */ + @ManagedAttribute(value = "Whether the TCP_NODELAY option is enabled", name = "tcpNoDelay") public boolean isTCPNoDelay() { return tcpNoDelay; @@ -900,6 +914,7 @@ public class HttpClient extends ContainerLifeCycle * @return whether request events must be strictly ordered * @see #setStrictEventOrdering(boolean) */ + @ManagedAttribute("Whether request/response events must be strictly ordered") public boolean isStrictEventOrdering() { return strictEventOrdering; @@ -940,6 +955,7 @@ public class HttpClient extends ContainerLifeCycle * @return whether destinations that have no connections should be removed * @see #setRemoveIdleDestinations(boolean) */ + @ManagedAttribute("Whether idle destinations are removed") public boolean isRemoveIdleDestinations() { return removeIdleDestinations; @@ -965,6 +981,7 @@ public class HttpClient extends ContainerLifeCycle /** * @return whether {@code connect()} operations are performed in blocking mode */ + @ManagedAttribute("Whether the connect() operation is blocking") public boolean isConnectBlocking() { return connectBlocking; diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java index 2d7a55ba9e..9031562db2 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java @@ -36,12 +36,15 @@ import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ssl.SslClientConnectionFactory; import org.eclipse.jetty.util.BlockingArrayQueue; import org.eclipse.jetty.util.Promise; +import org.eclipse.jetty.util.annotation.ManagedAttribute; +import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.component.Dumpable; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; -public abstract class HttpDestination implements Destination, Closeable, Dumpable +@ManagedObject +public abstract class HttpDestination extends ContainerLifeCycle implements Destination, Closeable, Dumpable { protected static final Logger LOG = Log.getLogger(HttpDestination.class); @@ -130,12 +133,14 @@ public abstract class HttpDestination implements Destination, Closeable, Dumpabl } @Override + @ManagedAttribute(value = "The destination scheme", readonly = true) public String getScheme() { return origin.getScheme(); } @Override + @ManagedAttribute(value = "The destination host", readonly = true) public String getHost() { // InetSocketAddress.getHostString() transforms the host string @@ -144,11 +149,18 @@ public abstract class HttpDestination implements Destination, Closeable, Dumpabl } @Override + @ManagedAttribute(value = "The destination port", readonly = true) public int getPort() { return origin.getAddress().getPort(); } + @ManagedAttribute(value = "The number of queued requests", readonly = true) + public int getQueuedRequestCount() + { + return exchanges.size(); + } + public Origin.Address getConnectAddress() { return proxy == null ? origin.getAddress() : proxy.getAddress(); diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java index ae994c6c7e..c48913e595 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java @@ -19,14 +19,17 @@ package org.eclipse.jetty.client; import java.io.IOException; -import java.util.Arrays; +import java.util.Collections; import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.annotation.ManagedAttribute; +import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.thread.Sweeper; +@ManagedObject public abstract class PoolingHttpDestination<C extends Connection> extends HttpDestination implements Callback { private final ConnectionPool connectionPool; @@ -35,6 +38,7 @@ public abstract class PoolingHttpDestination<C extends Connection> extends HttpD { super(client, origin); this.connectionPool = newConnectionPool(client); + addBean(connectionPool); Sweeper sweeper = client.getBean(Sweeper.class); if (sweeper != null) sweeper.offer(connectionPool); @@ -45,6 +49,7 @@ public abstract class PoolingHttpDestination<C extends Connection> extends HttpD return new ConnectionPool(this, client.getMaxConnectionsPerDestination(), this); } + @ManagedAttribute(value = "The connection pool", readonly = true) public ConnectionPool getConnectionPool() { return connectionPool; @@ -195,7 +200,7 @@ public abstract class PoolingHttpDestination<C extends Connection> extends HttpD public void dump(Appendable out, String indent) throws IOException { super.dump(out, indent); - ContainerLifeCycle.dump(out, indent, Arrays.asList(connectionPool)); + ContainerLifeCycle.dump(out, indent, Collections.singletonList(connectionPool)); } @Override diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java index d9a806a5e5..873fa6e451 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java @@ -27,7 +27,9 @@ import org.eclipse.jetty.client.Origin; import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.util.Promise; +import org.eclipse.jetty.util.annotation.ManagedObject; +@ManagedObject("The HTTP/1.1 client transport") public class HttpClientTransportOverHTTP extends AbstractHttpClientTransport { public HttpClientTransportOverHTTP() diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java index 813a0b43ae..8026880964 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java @@ -18,9 +18,6 @@ package org.eclipse.jetty.client; -import static java.nio.file.StandardOpenOption.CREATE; -import static org.junit.Assert.assertTrue; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -33,6 +30,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -124,8 +122,8 @@ public class HttpClientTest extends AbstractHttpClientServerTest client.stop(); Assert.assertEquals(0, client.getDestinations().size()); - Assert.assertEquals(0, connectionPool.getIdleConnections().size()); - Assert.assertEquals(0, connectionPool.getActiveConnections().size()); + Assert.assertEquals(0, connectionPool.getIdleConnectionCount()); + Assert.assertEquals(0, connectionPool.getActiveConnectionCount()); Assert.assertFalse(connection.getEndPoint().isOpen()); } @@ -543,10 +541,10 @@ public class HttpClientTest extends AbstractHttpClientServerTest start(new RespondThenConsumeHandler()); // Prepare a big file to upload - Path targetTestsDir = testdir.getEmptyDir().toPath(); + Path targetTestsDir = testdir.getEmptyPathDir(); Files.createDirectories(targetTestsDir); Path file = Paths.get(targetTestsDir.toString(), "http_client_conversation.big"); - try (OutputStream output = Files.newOutputStream(file, CREATE)) + try (OutputStream output = Files.newOutputStream(file, StandardOpenOption.CREATE)) { byte[] kb = new byte[1024]; for (int i = 0; i < 10 * 1024; ++i) @@ -813,7 +811,7 @@ public class HttpClientTest extends AbstractHttpClientServerTest }); } - assertTrue(latch.await(10, TimeUnit.SECONDS)); + Assert.assertTrue(latch.await(10, TimeUnit.SECONDS)); } @Test @@ -1119,7 +1117,7 @@ public class HttpClientTest extends AbstractHttpClientServerTest } }); - final Exchanger<Response> ex = new Exchanger<Response>(); + final Exchanger<Response> ex = new Exchanger<>(); BufferingResponseListener listener = new BufferingResponseListener() { @Override |