Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimone Bordet2015-08-13 13:16:14 +0000
committerSimone Bordet2015-08-13 13:16:14 +0000
commit69b90ef59b46e2675fdfdbc0e897bbb09ea0a0e4 (patch)
tree948809673b44e5c169617a28d43de8d45f601f54 /jetty-client
parent4c7d5f661ed50c19934dbd4a0cb6c3772b4262c2 (diff)
downloadorg.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')
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java9
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java16
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java19
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java14
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java9
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java2
-rw-r--r--jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java16
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

Back to the top