You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2013/04/02 22:09:36 UTC
svn commit: r1463726 [1/2] - in
/httpcomponents/httpasyncclient/trunk/httpasyncclient/src:
main/java/org/apache/http/impl/nio/conn/ main/java/org/apache/http/nio/conn/
main/java/org/apache/http/nio/conn/scheme/
main/java/org/apache/http/nio/conn/ssl/ t...
Author: olegk
Date: Tue Apr 2 20:09:35 2013
New Revision: 1463726
URL: http://svn.apache.org/r1463726
Log:
New async client connection manager API
Added:
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java
- copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java
- copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java (with props)
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java (with props)
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java
- copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java (with props)
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java
- copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java (with props)
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java
- copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/TestPoolingHttpClientAsyncConnectionManager.java (with props)
Modified:
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/LayeringStrategy.java
httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/SSLLayeringStrategy.java
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java Tue Apr 2 20:09:35 2013
@@ -31,6 +31,7 @@ import org.apache.http.nio.conn.scheme.A
import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
import org.apache.http.nio.conn.ssl.SSLLayeringStrategy;
+@Deprecated
@ThreadSafe
public final class AsyncSchemeRegistryFactory {
Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java Tue Apr 2 20:09:35 2013
@@ -29,39 +29,41 @@ package org.apache.http.impl.nio.conn;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpHost;
+import org.apache.http.annotation.ThreadSafe;
import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
import org.apache.http.nio.pool.AbstractNIOConnPool;
+import org.apache.http.nio.pool.NIOConnFactory;
import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOSession;
-class HttpNIOConnPool extends AbstractNIOConnPool<HttpRoute, IOSession, HttpPoolEntry> {
+@ThreadSafe
+class CPool extends AbstractNIOConnPool<HttpRoute, ManagedNHttpClientConnection, CPoolEntry> {
- private static final AtomicLong COUNTER = new AtomicLong(1);
+ private final Log log = LogFactory.getLog(CPool.class);
- private final Log log;
- private final AsyncSchemeRegistry schemeRegistry;
- private final long connTimeToLive;
+ private final long timeToLive;
private final TimeUnit tunit;
- HttpNIOConnPool(
- final Log log,
+ public CPool(
final ConnectingIOReactor ioreactor,
- final AsyncSchemeRegistry schemeRegistry,
- final long connTimeToLive, final TimeUnit tunit) {
- super(ioreactor, new HttpNIOConnPoolFactory(), 2, 20);
- this.log = log;
- this.schemeRegistry = schemeRegistry;
- this.connTimeToLive = connTimeToLive;
+ final NIOConnFactory<HttpRoute, ManagedNHttpClientConnection> connFactory,
+ final int defaultMaxPerRoute, final int maxTotal,
+ final long timeToLive, final TimeUnit tunit) {
+ super(ioreactor, connFactory, defaultMaxPerRoute, maxTotal);
+ this.timeToLive = timeToLive;
this.tunit = tunit;
}
@Override
+ protected CPoolEntry createEntry(final HttpRoute route, final ManagedNHttpClientConnection conn) {
+ return new CPoolEntry(this.log, conn.getId(), route, conn, this.timeToLive, this.tunit);
+ }
+
+ @Override
protected SocketAddress resolveLocalAddress(final HttpRoute route) {
return new InetSocketAddress(route.getLocalAddress(), 0);
}
@@ -73,18 +75,8 @@ class HttpNIOConnPool extends AbstractNI
firsthop = route.getTargetHost();
}
final String hostname = firsthop.getHostName();
- int port = firsthop.getPort();
- if (port < 0) {
- final AsyncScheme scheme = this.schemeRegistry.getScheme(firsthop);
- port = scheme.resolvePort(port);
- }
+ final int port = firsthop.getPort();
return new InetSocketAddress(hostname, port);
}
- @Override
- protected HttpPoolEntry createEntry(final HttpRoute route, final IOSession session) {
- final String id = Long.toString(COUNTER.getAndIncrement());
- return new HttpPoolEntry(this.log, id, route, session, this.connTimeToLive, this.tunit);
- }
-
}
Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java Tue Apr 2 20:09:35 2013
@@ -31,23 +31,43 @@ import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
+import org.apache.http.annotation.ThreadSafe;
import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.RouteTracker;
-import org.apache.http.nio.conn.ClientAsyncConnection;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
import org.apache.http.pool.PoolEntry;
-class HttpPoolEntry extends PoolEntry<HttpRoute, IOSession> {
+@ThreadSafe
+class CPoolEntry extends PoolEntry<HttpRoute, ManagedNHttpClientConnection> {
private final Log log;
- private final RouteTracker tracker;
+ private volatile boolean routeComplete;
- HttpPoolEntry(final Log log, final String id, final HttpRoute route, final IOSession session,
+ public CPoolEntry(
+ final Log log,
+ final String id,
+ final HttpRoute route,
+ final ManagedNHttpClientConnection conn,
final long timeToLive, final TimeUnit tunit) {
- super(id, route, session, timeToLive, tunit);
+ super(id, route, conn, timeToLive, tunit);
this.log = log;
- this.tracker = new RouteTracker(route);
+ }
+
+ public boolean isRouteComplete() {
+ return this.routeComplete;
+ }
+
+ public void markRouteComplete() {
+ this.routeComplete = true;
+ }
+
+ public void closeConnection() throws IOException {
+ final ManagedNHttpClientConnection conn = getConnection();
+ conn.close();
+ }
+
+ public void shutdownConnection() throws IOException {
+ final ManagedNHttpClientConnection conn = getConnection();
+ conn.shutdown();
}
@Override
@@ -59,38 +79,19 @@ class HttpPoolEntry extends PoolEntry<Ht
return expired;
}
- public ClientAsyncConnection getOperatedClientConnection() {
- final IOSession session = getConnection();
- return (ClientAsyncConnection) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
+ @Override
+ public boolean isClosed() {
+ final ManagedNHttpClientConnection conn = getConnection();
+ return !conn.isOpen();
}
@Override
public void close() {
try {
- getOperatedClientConnection().shutdown();
+ closeConnection();
} catch (final IOException ex) {
- if (this.log.isDebugEnabled()) {
- this.log.debug("I/O error shutting down connection", ex);
- }
+ this.log.debug("I/O error closing connection", ex);
}
}
- @Override
- public boolean isClosed() {
- final IOSession session = getConnection();
- return session.isClosed();
- }
-
- HttpRoute getPlannedRoute() {
- return super.getRoute();
- }
-
- RouteTracker getTracker() {
- return this.tracker;
- }
-
- HttpRoute getEffectiveRoute() {
- return this.tracker.toRoute();
- }
-
}
Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java Tue Apr 2 20:09:35 2013
@@ -0,0 +1,176 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.conn;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import org.apache.http.HttpConnection;
+import org.apache.http.annotation.NotThreadSafe;
+import org.apache.http.impl.conn.ConnectionShutdownException;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+
+@NotThreadSafe
+class CPoolProxy implements InvocationHandler {
+
+ private static final Method CLOSE_METHOD;
+ private static final Method SHUTDOWN_METHOD;
+ private static final Method IS_OPEN_METHOD;
+ private static final Method IS_STALE_METHOD;
+
+ static {
+ try {
+ CLOSE_METHOD = HttpConnection.class.getMethod("close");
+ SHUTDOWN_METHOD = HttpConnection.class.getMethod("shutdown");
+ IS_OPEN_METHOD = HttpConnection.class.getMethod("isOpen");
+ IS_STALE_METHOD = HttpConnection.class.getMethod("isStale");
+ } catch (final NoSuchMethodException ex) {
+ throw new Error(ex);
+ }
+ }
+
+ private volatile CPoolEntry poolEntry;
+
+ CPoolProxy(final CPoolEntry entry) {
+ super();
+ this.poolEntry = entry;
+ }
+
+ CPoolEntry getPoolEntry() {
+ return this.poolEntry;
+ }
+
+ CPoolEntry detach() {
+ final CPoolEntry local = this.poolEntry;
+ this.poolEntry = null;
+ return local;
+ }
+
+ NHttpClientConnection getConnection() {
+ final CPoolEntry local = this.poolEntry;
+ if (local == null) {
+ return null;
+ }
+ return local.getConnection();
+ }
+
+ public void close() throws IOException {
+ final CPoolEntry local = this.poolEntry;
+ if (local != null) {
+ local.closeConnection();
+ }
+ }
+
+ public void shutdown() throws IOException {
+ final CPoolEntry local = this.poolEntry;
+ if (local != null) {
+ local.shutdownConnection();
+ }
+ }
+
+ public boolean isOpen() {
+ final CPoolEntry local = this.poolEntry;
+ if (local != null) {
+ return !local.isClosed();
+ } else {
+ return false;
+ }
+ }
+
+ public boolean isStale() {
+ final NHttpClientConnection conn = getConnection();
+ if (conn != null) {
+ return conn.isStale() || !conn.isOpen();
+ } else {
+ return true;
+ }
+ }
+
+ public Object invoke(
+ final Object proxy, final Method method, final Object[] args) throws Throwable {
+ if (method.equals(CLOSE_METHOD)) {
+ close();
+ return null;
+ } else if (method.equals(SHUTDOWN_METHOD)) {
+ shutdown();
+ return null;
+ } else if (method.equals(IS_OPEN_METHOD)) {
+ return Boolean.valueOf(isOpen());
+ } else if (method.equals(IS_STALE_METHOD)) {
+ return Boolean.valueOf(isStale());
+ } else {
+ final NHttpClientConnection conn = getConnection();
+ if (conn == null) {
+ throw new ConnectionShutdownException();
+ }
+ try {
+ return method.invoke(conn, args);
+ } catch (final InvocationTargetException ex) {
+ final Throwable cause = ex.getCause();
+ if (cause != null) {
+ throw cause;
+ } else {
+ throw ex;
+ }
+ }
+ }
+ }
+
+ public static NHttpClientConnection newProxy(
+ final CPoolEntry poolEntry) {
+ return (NHttpClientConnection) Proxy.newProxyInstance(
+ CPoolProxy.class.getClassLoader(),
+ new Class<?>[] { ManagedNHttpClientConnection.class },
+ new CPoolProxy(poolEntry));
+ }
+
+ private static CPoolProxy getHandler(
+ final NHttpClientConnection proxy) {
+ final InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+ if (!CPoolProxy.class.isInstance(handler)) {
+ throw new IllegalStateException("Unexpected proxy handler class: " + handler);
+ }
+ return CPoolProxy.class.cast(handler);
+ }
+
+ public static CPoolEntry getPoolEntry(final NHttpClientConnection proxy) {
+ final CPoolEntry entry = getHandler(proxy).getPoolEntry();
+ if (entry == null) {
+ throw new ConnectionShutdownException();
+ }
+ return entry;
+ }
+
+ public static CPoolEntry detach(final NHttpClientConnection proxy) {
+ return getHandler(proxy).detach();
+ }
+
+}
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java Tue Apr 2 20:09:35 2013
@@ -38,6 +38,7 @@ import org.apache.http.nio.reactor.IOSes
import org.apache.http.nio.util.ByteBufferAllocator;
import org.apache.http.params.HttpParams;
+@Deprecated
public class DefaultClientAsyncConnection
extends DefaultNHttpClientConnection implements ClientAsyncConnection {
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java Tue Apr 2 20:09:35 2013
@@ -26,26 +26,66 @@
*/
package org.apache.http.impl.nio.conn;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseFactory;
+import org.apache.http.config.ConnectionConfig;
import org.apache.http.impl.DefaultHttpResponseFactory;
+import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
+import org.apache.http.message.BasicLineParser;
+import org.apache.http.nio.NHttpMessageParserFactory;
import org.apache.http.nio.conn.ClientAsyncConnection;
import org.apache.http.nio.conn.ClientAsyncConnectionFactory;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+import org.apache.http.nio.conn.NHttpConnectionFactory;
+import org.apache.http.nio.reactor.IOEventDispatch;
import org.apache.http.nio.reactor.IOSession;
import org.apache.http.nio.util.ByteBufferAllocator;
import org.apache.http.nio.util.HeapByteBufferAllocator;
import org.apache.http.params.HttpParams;
-public class DefaultClientAsyncConnectionFactory implements ClientAsyncConnectionFactory {
+@Deprecated
+public class DefaultClientAsyncConnectionFactory
+ implements ClientAsyncConnectionFactory, NHttpConnectionFactory<ManagedNHttpClientConnection> {
+
+ private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
+ private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
+ private final Log log = LogFactory.getLog(ManagedNHttpClientConnectionImpl.class);
+
+ public static final DefaultClientAsyncConnectionFactory INSTANCE = new DefaultClientAsyncConnectionFactory(null, null);
+
+ private static AtomicLong COUNTER = new AtomicLong();
private final HttpResponseFactory responseFactory;
+ private final NHttpMessageParserFactory<HttpResponse> responseParserFactory;
private final ByteBufferAllocator allocator;
+ public DefaultClientAsyncConnectionFactory(
+ final NHttpMessageParserFactory<HttpResponse> responseParserFactory,
+ final ByteBufferAllocator allocator) {
+ super();
+ this.responseFactory = createHttpResponseFactory();
+ this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
+ DefaultHttpResponseParserFactory.INSTANCE;
+ this.allocator = allocator != null ? allocator : HeapByteBufferAllocator.INSTANCE;
+ }
+
public DefaultClientAsyncConnectionFactory() {
super();
this.responseFactory = createHttpResponseFactory();
+ this.responseParserFactory = new DefaultHttpResponseParserFactory(
+ BasicLineParser.INSTANCE, this.responseFactory);
this.allocator = createByteBufferAllocator();
}
+ @Deprecated
public ClientAsyncConnection create(
final String id,
final IOSession iosession,
@@ -54,12 +94,47 @@ public class DefaultClientAsyncConnectio
id, iosession, this.responseFactory, this.allocator, params);
}
+ @Deprecated
protected ByteBufferAllocator createByteBufferAllocator() {
- return new HeapByteBufferAllocator();
+ return HeapByteBufferAllocator.INSTANCE;
}
+ @Deprecated
protected HttpResponseFactory createHttpResponseFactory() {
- return new DefaultHttpResponseFactory();
+ return DefaultHttpResponseFactory.INSTANCE;
+ }
+
+ public ManagedNHttpClientConnection create(
+ final IOSession iosession, final ConnectionConfig config) {
+ final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
+ CharsetDecoder chardecoder = null;
+ CharsetEncoder charencoder = null;
+ final Charset charset = config.getCharset();
+ final CodingErrorAction malformedInputAction = config.getMalformedInputAction() != null ?
+ config.getMalformedInputAction() : CodingErrorAction.REPORT;
+ final CodingErrorAction unmappableInputAction = config.getUnmappableInputAction() != null ?
+ config.getUnmappableInputAction() : CodingErrorAction.REPORT;
+ if (charset != null) {
+ chardecoder = charset.newDecoder();
+ chardecoder.onMalformedInput(malformedInputAction);
+ chardecoder.onUnmappableCharacter(unmappableInputAction);
+ charencoder = charset.newEncoder();
+ charencoder.onMalformedInput(malformedInputAction);
+ charencoder.onUnmappableCharacter(unmappableInputAction);
+ }
+ final ManagedNHttpClientConnection conn = new ManagedNHttpClientConnectionImpl(
+ id,
+ this.log,
+ this.headerlog,
+ this.wirelog,
+ iosession,
+ 8 * 1024,
+ this.allocator,
+ chardecoder, charencoder, config.getMessageConstraints(),
+ null, null, null,
+ this.responseParserFactory);
+ iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+ return conn;
}
}
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java Tue Apr 2 20:09:35 2013
@@ -41,6 +41,7 @@ import org.apache.http.nio.conn.scheme.A
import org.apache.http.nio.conn.scheme.LayeringStrategy;
import org.apache.http.protocol.HttpContext;
+@Deprecated
public class DefaultHttpAsyncRoutePlanner implements HttpRoutePlanner {
private final AsyncSchemeRegistry schemeRegistry;
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java Tue Apr 2 20:09:35 2013
@@ -40,6 +40,7 @@ import org.apache.http.nio.pool.Abstract
import org.apache.http.nio.reactor.ConnectingIOReactor;
import org.apache.http.nio.reactor.IOSession;
+@Deprecated
class HttpNIOConnPool extends AbstractNIOConnPool<HttpRoute, IOSession, HttpPoolEntry> {
private static final AtomicLong COUNTER = new AtomicLong(1);
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java Tue Apr 2 20:09:35 2013
@@ -32,6 +32,7 @@ import org.apache.http.conn.routing.Http
import org.apache.http.nio.pool.NIOConnFactory;
import org.apache.http.nio.reactor.IOSession;
+@Deprecated
class HttpNIOConnPoolFactory implements NIOConnFactory<HttpRoute, IOSession> {
public IOSession create(final HttpRoute route, final IOSession session) throws IOException {
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java Tue Apr 2 20:09:35 2013
@@ -38,6 +38,7 @@ import org.apache.http.nio.reactor.IOEve
import org.apache.http.nio.reactor.IOSession;
import org.apache.http.pool.PoolEntry;
+@Deprecated
class HttpPoolEntry extends PoolEntry<HttpRoute, IOSession> {
private final Log log;
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java Tue Apr 2 20:09:35 2013
@@ -54,6 +54,7 @@ import org.apache.http.nio.reactor.ssl.S
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
+@Deprecated
class ManagedClientAsyncConnectionImpl implements ManagedClientAsyncConnection {
private final ClientAsyncConnectionManager manager;
Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java Tue Apr 2 20:09:35 2013
@@ -0,0 +1,118 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.conn;
+
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.impl.nio.codecs.DefaultHttpRequestWriterFactory;
+import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
+import org.apache.http.nio.NHttpMessageParserFactory;
+import org.apache.http.nio.NHttpMessageWriterFactory;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+import org.apache.http.nio.conn.NHttpConnectionFactory;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.util.ByteBufferAllocator;
+import org.apache.http.nio.util.HeapByteBufferAllocator;
+
+public class ManagedNHttpClientConnectionFactory implements NHttpConnectionFactory<ManagedNHttpClientConnection> {
+
+ private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
+ private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
+ private final Log log = LogFactory.getLog(ManagedNHttpClientConnectionImpl.class);
+
+ private static AtomicLong COUNTER = new AtomicLong();
+
+ public static final ManagedNHttpClientConnectionFactory INSTANCE = new ManagedNHttpClientConnectionFactory();
+
+ private final ByteBufferAllocator allocator;
+ private final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory;
+ private final NHttpMessageParserFactory<HttpResponse> responseParserFactory;
+
+ public ManagedNHttpClientConnectionFactory(
+ final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory,
+ final NHttpMessageParserFactory<HttpResponse> responseParserFactory,
+ final ByteBufferAllocator allocator) {
+ super();
+ this.requestWriterFactory = requestWriterFactory != null ? requestWriterFactory :
+ DefaultHttpRequestWriterFactory.INSTANCE;
+ this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
+ DefaultHttpResponseParserFactory.INSTANCE;
+ this.allocator = allocator != null ? allocator : HeapByteBufferAllocator.INSTANCE;
+ }
+
+ public ManagedNHttpClientConnectionFactory() {
+ this(null, null, null);
+ }
+
+ public ManagedNHttpClientConnection create(
+ final IOSession iosession, final ConnectionConfig config) {
+ final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
+ CharsetDecoder chardecoder = null;
+ CharsetEncoder charencoder = null;
+ final Charset charset = config.getCharset();
+ final CodingErrorAction malformedInputAction = config.getMalformedInputAction() != null ?
+ config.getMalformedInputAction() : CodingErrorAction.REPORT;
+ final CodingErrorAction unmappableInputAction = config.getUnmappableInputAction() != null ?
+ config.getUnmappableInputAction() : CodingErrorAction.REPORT;
+ if (charset != null) {
+ chardecoder = charset.newDecoder();
+ chardecoder.onMalformedInput(malformedInputAction);
+ chardecoder.onUnmappableCharacter(unmappableInputAction);
+ charencoder = charset.newEncoder();
+ charencoder.onMalformedInput(malformedInputAction);
+ charencoder.onUnmappableCharacter(unmappableInputAction);
+ }
+ final ManagedNHttpClientConnection conn = new ManagedNHttpClientConnectionImpl(
+ id,
+ this.log,
+ this.headerlog,
+ this.wirelog,
+ iosession,
+ 8 * 1024,
+ this.allocator,
+ chardecoder,
+ charencoder,
+ config.getMessageConstraints(),
+ null,
+ null,
+ this.requestWriterFactory,
+ this.responseParserFactory);
+ iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+ return conn;
+ }
+
+}
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java Tue Apr 2 20:09:35 2013
@@ -26,50 +26,76 @@
*/
package org.apache.http.impl.nio.conn;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+
+import javax.net.ssl.SSLSession;
+
import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseFactory;
+import org.apache.http.config.MessageConstraints;
+import org.apache.http.entity.ContentLengthStrategy;
import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.nio.conn.ClientAsyncConnection;
+import org.apache.http.nio.NHttpMessageParserFactory;
+import org.apache.http.nio.NHttpMessageWriterFactory;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.ssl.SSLIOSession;
import org.apache.http.nio.util.ByteBufferAllocator;
-import org.apache.http.params.HttpParams;
+import org.apache.http.util.Args;
+import org.apache.http.util.Asserts;
-public class DefaultClientAsyncConnection
- extends DefaultNHttpClientConnection implements ClientAsyncConnection {
+class ManagedNHttpClientConnectionImpl
+ extends DefaultNHttpClientConnection implements ManagedNHttpClientConnection {
- private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
- private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
+ private final Log headerlog;
+ private final Log wirelog;
private final Log log;
private final String id;
private IOSession original;
- public DefaultClientAsyncConnection(
+ public ManagedNHttpClientConnectionImpl(
final String id,
+ final Log log,
+ final Log headerlog,
+ final Log wirelog,
final IOSession iosession,
- final HttpResponseFactory responseFactory,
+ final int buffersize,
final ByteBufferAllocator allocator,
- final HttpParams params) {
- super(iosession, responseFactory, allocator, params);
+ final CharsetDecoder chardecoder,
+ final CharsetEncoder charencoder,
+ final MessageConstraints constraints,
+ final ContentLengthStrategy incomingContentStrategy,
+ final ContentLengthStrategy outgoingContentStrategy,
+ final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory,
+ final NHttpMessageParserFactory<HttpResponse> responseParserFactory) {
+ super(iosession, buffersize, allocator, chardecoder, charencoder, constraints,
+ incomingContentStrategy, outgoingContentStrategy,
+ requestWriterFactory, responseParserFactory);
this.id = id;
+ this.log = log;
+ this.headerlog = headerlog;
+ this.wirelog = wirelog;
this.original = iosession;
- this.log = LogFactory.getLog(iosession.getClass());
if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
- bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
+ super.bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
}
}
- public void upgrade(final IOSession iosession) {
+ @Override
+ public void bind(final IOSession iosession) {
+ Args.notNull(iosession, "I/O session");
+ Asserts.check(!iosession.isClosed(), "I/O session is closed");
+ this.status = ACTIVE;
this.original = iosession;
if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
this.log.debug(this.id + " Upgrade session " + iosession);
- bind(new LoggingIOSession(iosession, this.id, this.headerlog, this.wirelog));
+ super.bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
} else {
- bind(iosession);
+ super.bind(iosession);
}
}
@@ -77,6 +103,14 @@ public class DefaultClientAsyncConnectio
return this.original;
}
+ public SSLSession getSSLSession() {
+ if (this.original instanceof SSLIOSession) {
+ return ((SSLIOSession) this.original).getSSLSession();
+ } else {
+ return null;
+ }
+ }
+
public String getId() {
return this.id;
}
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java Tue Apr 2 20:09:35 2013
@@ -46,6 +46,7 @@ import org.apache.http.nio.reactor.IORea
import org.apache.http.pool.ConnPoolControl;
import org.apache.http.pool.PoolStats;
+@Deprecated
public class PoolingClientAsyncConnectionManager
implements ClientAsyncConnectionManager, ConnPoolControl<HttpRoute> {
Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java Tue Apr 2 20:09:35 2013
@@ -0,0 +1,591 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.conn;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpHost;
+import org.apache.http.concurrent.BasicFuture;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.DnsResolver;
+import org.apache.http.conn.SchemePortResolver;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.conn.DefaultSchemePortResolver;
+import org.apache.http.impl.conn.SystemDefaultDnsResolver;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.conn.NHttpClientConnectionManager;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+import org.apache.http.nio.conn.NHttpConnectionFactory;
+import org.apache.http.nio.conn.scheme.LayeringStrategy;
+import org.apache.http.nio.conn.ssl.SSLLayeringStrategy;
+import org.apache.http.nio.pool.NIOConnFactory;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionRequest;
+import org.apache.http.nio.reactor.SessionRequestCallback;
+import org.apache.http.pool.ConnPoolControl;
+import org.apache.http.pool.PoolStats;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.util.Args;
+import org.apache.http.util.Asserts;
+
+public class PoolingNHttpClientConnectionManager
+ implements NHttpClientConnectionManager, ConnPoolControl<HttpRoute> {
+
+ private final Log log = LogFactory.getLog(getClass());
+
+ private final ConnectingIOReactor ioreactor;
+ private final ConfigData configData;
+ private final CPool pool;
+ private final Registry<LayeringStrategy> layeringStrategyRegistry;
+ private final SchemePortResolver schemePortResolver;
+ private final DnsResolver dnsResolver;
+
+ private static Registry<LayeringStrategy> getDefaultRegistry() {
+ return RegistryBuilder.<LayeringStrategy>create()
+ .register("https", SSLLayeringStrategy.getDefaultStrategy())
+ .build();
+ }
+
+ public PoolingNHttpClientConnectionManager(final ConnectingIOReactor ioreactor) {
+ this(ioreactor, getDefaultRegistry());
+ }
+
+ public PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final Registry<LayeringStrategy> layeringStrategyRegistry) {
+ this(ioreactor, null, layeringStrategyRegistry, null);
+ }
+
+ public PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+ final DnsResolver dnsResolver) {
+ this(ioreactor, connFactory, getDefaultRegistry(), dnsResolver);
+ }
+
+ public PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory) {
+ this(ioreactor, connFactory, getDefaultRegistry(), null);
+ }
+
+ public PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+ final Registry<LayeringStrategy> layeringStrategyRegistry) {
+ this(ioreactor, connFactory, layeringStrategyRegistry, null);
+ }
+
+ public PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+ final Registry<LayeringStrategy> layeringStrategyRegistry,
+ final DnsResolver dnsResolver) {
+ this(ioreactor, connFactory, layeringStrategyRegistry, null, dnsResolver,
+ -1, TimeUnit.MILLISECONDS);
+ }
+
+ public PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+ final Registry<LayeringStrategy> layeringStrategyRegistry,
+ final SchemePortResolver schemePortResolver,
+ final DnsResolver dnsResolver,
+ final long timeToLive, final TimeUnit tunit) {
+ super();
+ Args.notNull(ioreactor, "I/O reactor");
+ Args.notNull(layeringStrategyRegistry, "Layering strategy registry");
+ this.ioreactor = ioreactor;
+ this.configData = new ConfigData();
+ this.pool = new CPool(ioreactor,
+ new InternalConnectionFactory(this.configData, connFactory),
+ 2, 20, timeToLive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
+ this.layeringStrategyRegistry = layeringStrategyRegistry;
+ this.schemePortResolver = schemePortResolver != null ? schemePortResolver :
+ DefaultSchemePortResolver.INSTANCE;
+ this.dnsResolver = dnsResolver != null ? dnsResolver :
+ SystemDefaultDnsResolver.INSTANCE;
+ }
+
+ PoolingNHttpClientConnectionManager(
+ final ConnectingIOReactor ioreactor,
+ final CPool pool,
+ final Registry<LayeringStrategy> layeringStrategyRegistry,
+ final SchemePortResolver schemePortResolver,
+ final DnsResolver dnsResolver,
+ final long timeToLive, final TimeUnit tunit) {
+ super();
+ this.ioreactor = ioreactor;
+ this.configData = new ConfigData();
+ this.pool = pool;
+ this.layeringStrategyRegistry = layeringStrategyRegistry;
+ this.schemePortResolver = schemePortResolver != null ? schemePortResolver :
+ DefaultSchemePortResolver.INSTANCE;
+ this.dnsResolver = dnsResolver != null ? dnsResolver :
+ SystemDefaultDnsResolver.INSTANCE;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ shutdown();
+ } finally {
+ super.finalize();
+ }
+ }
+
+ public void execute(final IOEventDispatch eventDispatch) throws IOException {
+ this.ioreactor.execute(eventDispatch);
+ }
+
+ public void shutdown(final long waitMs) throws IOException {
+ this.log.debug("Connection manager is shutting down");
+ this.pool.shutdown(waitMs);
+ this.log.debug("Connection manager shut down");
+ }
+
+ public void shutdown() throws IOException {
+ this.log.debug("Connection manager is shutting down");
+ this.pool.shutdown(2000);
+ this.log.debug("Connection manager shut down");
+ }
+
+ private String format(final HttpRoute route, final Object state) {
+ final StringBuilder buf = new StringBuilder();
+ buf.append("[route: ").append(route).append("]");
+ if (state != null) {
+ buf.append("[state: ").append(state).append("]");
+ }
+ return buf.toString();
+ }
+
+ private String formatStats(final HttpRoute route) {
+ final StringBuilder buf = new StringBuilder();
+ final PoolStats totals = this.pool.getTotalStats();
+ final PoolStats stats = this.pool.getStats(route);
+ buf.append("[total kept alive: ").append(totals.getAvailable()).append("; ");
+ buf.append("route allocated: ").append(stats.getLeased() + stats.getAvailable());
+ buf.append(" of ").append(stats.getMax()).append("; ");
+ buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable());
+ buf.append(" of ").append(totals.getMax()).append("]");
+ return buf.toString();
+ }
+
+ private String format(final CPoolEntry entry) {
+ final StringBuilder buf = new StringBuilder();
+ buf.append("[id: ").append(entry.getId()).append("]");
+ buf.append("[route: ").append(entry.getRoute()).append("]");
+ final Object state = entry.getState();
+ if (state != null) {
+ buf.append("[state: ").append(state).append("]");
+ }
+ return buf.toString();
+ }
+
+ public Future<NHttpClientConnection> requestConnection(
+ final HttpRoute route,
+ final Object state,
+ final long connectTimeout,
+ final TimeUnit tunit,
+ final FutureCallback<NHttpClientConnection> callback) {
+ Args.notNull(route, "HTTP route");
+ if (this.log.isDebugEnabled()) {
+ this.log.debug("Connection request: " + format(route, state) + formatStats(route));
+ }
+ final BasicFuture<NHttpClientConnection> future = new BasicFuture<NHttpClientConnection>(callback);
+ this.pool.lease(route, state, connectTimeout,
+ tunit != null ? tunit : TimeUnit.MILLISECONDS,
+ new InternalPoolEntryCallback(future));
+ return future;
+ }
+
+ public void releaseConnection(
+ final NHttpClientConnection managedConn,
+ final Object state,
+ final long keepalive,
+ final TimeUnit tunit) {
+ Args.notNull(managedConn, "Managed connection");
+ synchronized (managedConn) {
+ final CPoolEntry entry = CPoolProxy.detach(managedConn);
+ if (entry == null) {
+ return;
+ }
+ final NHttpClientConnection conn = entry.getConnection();
+ try {
+ if (conn.isOpen()) {
+ entry.setState(state);
+ entry.updateExpiry(keepalive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
+ if (this.log.isDebugEnabled()) {
+ String s;
+ if (keepalive > 0) {
+ s = "for " + (double) keepalive / 1000 + " seconds";
+ } else {
+ s = "indefinitely";
+ }
+ this.log.debug("Connection " + format(entry) + " can be kept alive " + s);
+ }
+ }
+ } finally {
+ this.pool.release(entry, conn.isOpen() && entry.isRouteComplete());
+ if (this.log.isDebugEnabled()) {
+ this.log.debug("Connection released: " + format(entry) + formatStats(entry.getRoute()));
+ }
+ }
+ }
+ }
+
+ public Future<NHttpClientConnection> connect(
+ final NHttpClientConnection managedConn,
+ final HttpRoute route,
+ final int connectTimeout,
+ final FutureCallback<NHttpClientConnection> callback) {
+ Args.notNull(managedConn, "Managed connection");
+ final BasicFuture<NHttpClientConnection> future = new BasicFuture<NHttpClientConnection>(callback);
+ if (managedConn.isOpen()) {
+ future.completed(managedConn);
+ return future;
+ }
+ final HttpHost host;
+ if (route.getProxyHost() != null) {
+ host = route.getProxyHost();
+ } else {
+ host = route.getTargetHost();
+ }
+ final InetSocketAddress localAddress = route.getLocalAddress() != null ?
+ new InetSocketAddress(route.getLocalAddress(), 0) : null;
+ final InetAddress[] addresses;
+ try {
+ addresses = this.dnsResolver.resolve(host.getHostName());
+ } catch (final UnknownHostException ex) {
+ future.failed(ex);
+ return future;
+ }
+ final int port = this.schemePortResolver.resolve(host);
+ final InetSocketAddress remoteAddress = new InetSocketAddress(addresses[0], port);
+ this.ioreactor.connect(remoteAddress, localAddress, null, new SessionRequestCallback() {
+
+ public void completed(final SessionRequest request) {
+ synchronized (managedConn) {
+ final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+ final ManagedNHttpClientConnection conn = entry.getConnection();
+ final IOSession iosession = request.getSession();
+ iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+ conn.bind(iosession);
+ }
+ future.completed(managedConn);
+ }
+
+ public void timeout(final SessionRequest request) {
+ future.failed(new ConnectTimeoutException(host, remoteAddress));
+ }
+
+ public void failed(final SessionRequest request) {
+ future.failed(request.getException());
+ }
+
+ public void cancelled(final SessionRequest request) {
+ future.cancel();
+ }
+
+ });
+ return future;
+ }
+
+ public void initialize(
+ final NHttpClientConnection managedConn,
+ final HttpRoute route,
+ final HttpContext context) throws IOException {
+ Args.notNull(managedConn, "Managed connection");
+ Args.notNull(route, "HTTP route");
+ final HttpHost host;
+ if (route.getProxyHost() != null) {
+ host = route.getProxyHost();
+ } else {
+ host = route.getTargetHost();
+ }
+ final LayeringStrategy layeringStrategy = layeringStrategyRegistry.lookup(
+ host.getSchemeName());
+ if (layeringStrategy != null) {
+ synchronized (managedConn) {
+ final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+ final ManagedNHttpClientConnection conn = entry.getConnection();
+ final IOSession currentSession = layeringStrategy.layer(conn.getIOSession());
+ conn.bind(currentSession);
+ }
+ }
+ }
+
+ public void upgrade(
+ final NHttpClientConnection managedConn,
+ final HttpRoute route,
+ final HttpContext context) throws IOException {
+ Args.notNull(managedConn, "Managed connection");
+ Args.notNull(route, "HTTP route");
+ final HttpHost host = route.getTargetHost();
+ final LayeringStrategy layeringStrategy = layeringStrategyRegistry.lookup(
+ host.getSchemeName());
+ synchronized (managedConn) {
+ final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+ final ManagedNHttpClientConnection conn = entry.getConnection();
+ Asserts.check(layeringStrategy != null, "Layering is not supported for this scheme");
+ final IOSession currentSession = layeringStrategy.layer(conn.getIOSession());
+ conn.bind(currentSession);
+ }
+ }
+
+ public void routeComplete(
+ final NHttpClientConnection managedConn,
+ final HttpRoute route,
+ final HttpContext context) throws IOException {
+ Args.notNull(managedConn, "Managed connection");
+ Args.notNull(route, "HTTP route");
+ synchronized (managedConn) {
+ final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+ entry.markRouteComplete();
+ }
+ }
+
+ public boolean isRouteComplete(
+ final NHttpClientConnection managedConn) {
+ Args.notNull(managedConn, "Managed connection");
+ synchronized (managedConn) {
+ final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+ return entry.isRouteComplete();
+ }
+ }
+
+ public void closeIdleConnections(final long idleTimeout, final TimeUnit tunit) {
+ if (log.isDebugEnabled()) {
+ log.debug("Closing connections idle longer than " + idleTimeout + " " + tunit);
+ }
+ this.pool.closeIdle(idleTimeout, tunit);
+ }
+
+ public void closeExpiredConnections() {
+ log.debug("Closing expired connections");
+ this.pool.closeExpired();
+ }
+
+ public int getMaxTotal() {
+ return this.pool.getMaxTotal();
+ }
+
+ public void setMaxTotal(final int max) {
+ this.pool.setMaxTotal(max);
+ }
+
+ public int getDefaultMaxPerRoute() {
+ return this.pool.getDefaultMaxPerRoute();
+ }
+
+ public void setDefaultMaxPerRoute(final int max) {
+ this.pool.setDefaultMaxPerRoute(max);
+ }
+
+ public int getMaxPerRoute(final HttpRoute route) {
+ return this.pool.getMaxPerRoute(route);
+ }
+
+ public void setMaxPerRoute(final HttpRoute route, final int max) {
+ this.pool.setMaxPerRoute(route, max);
+ }
+
+ public PoolStats getTotalStats() {
+ return this.pool.getTotalStats();
+ }
+
+ public PoolStats getStats(final HttpRoute route) {
+ return this.pool.getStats(route);
+ }
+
+ public SocketConfig getDefaultSocketConfig() {
+ return this.configData.getDefaultSocketConfig();
+ }
+
+ public void setDefaultSocketConfig(final SocketConfig defaultSocketConfig) {
+ this.configData.setDefaultSocketConfig(defaultSocketConfig);
+ }
+
+ public ConnectionConfig getDefaultConnectionConfig() {
+ return this.configData.getDefaultConnectionConfig();
+ }
+
+ public void setDefaultConnectionConfig(final ConnectionConfig defaultConnectionConfig) {
+ this.configData.setDefaultConnectionConfig(defaultConnectionConfig);
+ }
+
+ public SocketConfig getSocketConfig(final HttpHost host) {
+ return this.configData.getSocketConfig(host);
+ }
+
+ public void setSocketConfig(final HttpHost host, final SocketConfig socketConfig) {
+ this.configData.setSocketConfig(host, socketConfig);
+ }
+
+ public ConnectionConfig getConnectionConfig(final HttpHost host) {
+ return this.configData.getConnectionConfig(host);
+ }
+
+ public void setConnectionConfig(final HttpHost host, final ConnectionConfig connectionConfig) {
+ this.configData.setConnectionConfig(host, connectionConfig);
+ }
+
+ class InternalPoolEntryCallback implements FutureCallback<CPoolEntry> {
+
+ private final BasicFuture<NHttpClientConnection> future;
+
+ public InternalPoolEntryCallback(
+ final BasicFuture<NHttpClientConnection> future) {
+ super();
+ this.future = future;
+ }
+
+ public void completed(final CPoolEntry entry) {
+ Asserts.check(entry.getConnection() != null, "Pool entry with no connection");
+ if (log.isDebugEnabled()) {
+ log.debug("Connection leased: " + format(entry) + formatStats(entry.getRoute()));
+ }
+ final NHttpClientConnection managedConn = CPoolProxy.newProxy(entry);
+ if (!this.future.completed(managedConn)) {
+ pool.release(entry, true);
+ }
+ }
+
+ public void failed(final Exception ex) {
+ if (log.isDebugEnabled()) {
+ log.debug("Connection request failed", ex);
+ }
+ this.future.failed(ex);
+ }
+
+ public void cancelled() {
+ log.debug("Connection request cancelled");
+ this.future.cancel(true);
+ }
+
+ }
+
+ static class ConfigData {
+
+ private final Map<HttpHost, SocketConfig> socketConfigMap;
+ private final Map<HttpHost, ConnectionConfig> connectionConfigMap;
+ private volatile SocketConfig defaultSocketConfig;
+ private volatile ConnectionConfig defaultConnectionConfig;
+
+ ConfigData() {
+ super();
+ this.socketConfigMap = new ConcurrentHashMap<HttpHost, SocketConfig>();
+ this.connectionConfigMap = new ConcurrentHashMap<HttpHost, ConnectionConfig>();
+ }
+
+ public SocketConfig getDefaultSocketConfig() {
+ return this.defaultSocketConfig;
+ }
+
+ public void setDefaultSocketConfig(final SocketConfig defaultSocketConfig) {
+ this.defaultSocketConfig = defaultSocketConfig;
+ }
+
+ public ConnectionConfig getDefaultConnectionConfig() {
+ return this.defaultConnectionConfig;
+ }
+
+ public void setDefaultConnectionConfig(final ConnectionConfig defaultConnectionConfig) {
+ this.defaultConnectionConfig = defaultConnectionConfig;
+ }
+
+ public SocketConfig getSocketConfig(final HttpHost host) {
+ return this.socketConfigMap.get(host);
+ }
+
+ public void setSocketConfig(final HttpHost host, final SocketConfig socketConfig) {
+ this.socketConfigMap.put(host, socketConfig);
+ }
+
+ public ConnectionConfig getConnectionConfig(final HttpHost host) {
+ return this.connectionConfigMap.get(host);
+ }
+
+ public void setConnectionConfig(final HttpHost host, final ConnectionConfig connectionConfig) {
+ this.connectionConfigMap.put(host, connectionConfig);
+ }
+
+ }
+
+ static class InternalConnectionFactory implements NIOConnFactory<HttpRoute, ManagedNHttpClientConnection> {
+
+ private final ConfigData configData;
+ private final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory;
+
+ InternalConnectionFactory(
+ final ConfigData configData,
+ final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory) {
+ super();
+ this.configData = configData != null ? configData : new ConfigData();
+ this.connFactory = connFactory != null ? connFactory :
+ ManagedNHttpClientConnectionFactory.INSTANCE;
+ }
+
+ public ManagedNHttpClientConnection create(
+ final HttpRoute route, final IOSession iosession) throws IOException {
+ ConnectionConfig config = null;
+ if (route.getProxyHost() != null) {
+ config = this.configData.getConnectionConfig(route.getProxyHost());
+ }
+ if (config == null) {
+ config = this.configData.getConnectionConfig(route.getTargetHost());
+ }
+ if (config == null) {
+ config = this.configData.getDefaultConnectionConfig();
+ }
+ if (config == null) {
+ config = ConnectionConfig.DEFAULT;
+ }
+ final ManagedNHttpClientConnection conn = this.connFactory.create(iosession, config);
+ iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+ return conn;
+ }
+
+ }
+
+}
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java Tue Apr 2 20:09:35 2013
@@ -30,6 +30,7 @@ import org.apache.http.HttpInetConnectio
import org.apache.http.nio.NHttpClientConnection;
import org.apache.http.nio.reactor.IOSession;
+@Deprecated
public interface ClientAsyncConnection extends NHttpClientConnection, HttpInetConnection {
void upgrade(IOSession iosession);
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java Tue Apr 2 20:09:35 2013
@@ -29,6 +29,7 @@ package org.apache.http.nio.conn;
import org.apache.http.nio.reactor.IOSession;
import org.apache.http.params.HttpParams;
+@Deprecated
public interface ClientAsyncConnectionFactory {
ClientAsyncConnection create(String id, IOSession iosession, HttpParams params);
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java Tue Apr 2 20:09:35 2013
@@ -34,6 +34,7 @@ import org.apache.http.conn.routing.Http
import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
import org.apache.http.nio.reactor.IOReactor;
+@Deprecated
public interface ClientAsyncConnectionManager extends IOReactor {
AsyncSchemeRegistry getSchemeRegistry();
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java Tue Apr 2 20:09:35 2013
@@ -37,6 +37,7 @@ import org.apache.http.nio.NHttpClientCo
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
+@Deprecated
public interface ManagedClientAsyncConnection
extends HttpRoutedConnection, NHttpClientConnection, ConnectionReleaseTrigger {
Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java Tue Apr 2 20:09:35 2013
@@ -26,14 +26,20 @@
*/
package org.apache.http.nio.conn;
+import javax.net.ssl.SSLSession;
+
import org.apache.http.HttpInetConnection;
import org.apache.http.nio.NHttpClientConnection;
import org.apache.http.nio.reactor.IOSession;
-public interface ClientAsyncConnection extends NHttpClientConnection, HttpInetConnection {
+public interface ManagedNHttpClientConnection extends NHttpClientConnection, HttpInetConnection {
+
+ String getId();
- void upgrade(IOSession iosession);
+ void bind(IOSession iosession);
IOSession getIOSession();
+ SSLSession getSSLSession();
+
}
Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java Tue Apr 2 20:09:35 2013
@@ -0,0 +1,137 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.nio.conn;
+
+import java.io.IOException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.protocol.HttpContext;
+
+/**
+ * Represents a manager of persistent client connections.
+ * <p/>
+ * The purpose of an HTTP connection manager is to serve as a factory for new
+ * HTTP connections, manage persistent connections and synchronize access to
+ * persistent connections making sure that only one thread of execution can
+ * have access to a connection at a time.
+ * <p/>
+ * Implementations of this interface must be thread-safe. Access to shared
+ * data must be synchronized as methods of this interface may be executed
+ * from multiple threads.
+ */
+public interface NHttpClientConnectionManager {
+
+ /**
+ * Returns a {@link Future} for a {@link NHttpClientConnection}.
+ */
+ Future<NHttpClientConnection> requestConnection(
+ HttpRoute route, Object state,
+ long connectTimeout, TimeUnit timeUnit,
+ FutureCallback<NHttpClientConnection> callback);
+
+ /**
+ * Releases a connection for use by others.
+ * You may optionally specify how long the connection is valid
+ * to be reused. Values <= 0 are considered to be valid forever.
+ * If the connection is not marked as reusable, the connection will
+ * not be reused regardless of the valid duration.
+ *
+ * If the connection has been released before,
+ * the call will be ignored.
+ *
+ * @param conn the connection to release
+ * @param validDuration the duration of time this connection is valid for reuse
+ * @param timeUnit the unit of time validDuration is measured in
+ *
+ * @see #closeExpiredConnections()
+ */
+ void releaseConnection(
+ NHttpClientConnection conn, Object newState, long validDuration, TimeUnit timeUnit);
+
+ Future<NHttpClientConnection> connect(
+ NHttpClientConnection conn,
+ HttpRoute route,
+ int connectTimeout,
+ FutureCallback<NHttpClientConnection> callback);
+
+ void initialize(
+ NHttpClientConnection conn,
+ HttpRoute route,
+ HttpContext context) throws IOException;
+
+ void upgrade(
+ NHttpClientConnection conn,
+ HttpRoute route,
+ HttpContext context) throws IOException;
+
+ void routeComplete(
+ NHttpClientConnection conn,
+ HttpRoute route,
+ HttpContext context) throws IOException;
+
+ boolean isRouteComplete(NHttpClientConnection conn);
+
+ /**
+ * Closes idle connections in the pool.
+ * Open connections in the pool that have not been used for the
+ * timespan given by the argument will be closed.
+ * Currently allocated connections are not subject to this method.
+ * Times will be checked with milliseconds precision
+ *
+ * All expired connections will also be closed.
+ *
+ * @param idletime the idle time of connections to be closed
+ * @param tunit the unit for the <code>idletime</code>
+ *
+ * @see #closeExpiredConnections()
+ */
+ void closeIdleConnections(long idletime, TimeUnit tunit);
+
+ /**
+ * Closes all expired connections in the pool.
+ * Open connections in the pool that have not been used for
+ * the timespan defined when the connection was released will be closed.
+ * Currently allocated connections are not subject to this method.
+ * Times will be checked with milliseconds precision.
+ */
+ void closeExpiredConnections();
+
+ void execute(IOEventDispatch eventDispatch) throws IOException;
+
+ /**
+ * Shuts down this connection manager and releases allocated resources.
+ * This includes closing all connections, whether they are currently
+ * used or not.
+ */
+ void shutdown() throws IOException;
+
+}
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java Tue Apr 2 20:09:35 2013
@@ -26,11 +26,12 @@
*/
package org.apache.http.nio.conn;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.nio.NHttpConnection;
import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.params.HttpParams;
-public interface ClientAsyncConnectionFactory {
+public interface NHttpConnectionFactory<T extends NHttpConnection> {
- ClientAsyncConnection create(String id, IOSession iosession, HttpParams params);
+ T create(IOSession iosession, ConnectionConfig config);
}
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java Tue Apr 2 20:09:35 2013
@@ -30,6 +30,7 @@ import java.util.Locale;
import org.apache.http.util.LangUtils;
+@Deprecated
public final class AsyncScheme {
/** The name of this scheme, in lowercase. (e.g. http, https) */
Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java Tue Apr 2 20:09:35 2013
@@ -38,6 +38,7 @@ import org.apache.http.HttpHost;
* Schemes are identified by lowercase names.
*
*/
+@Deprecated
public final class AsyncSchemeRegistry {
/** The available schemes in this registry. */