You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2010/02/23 12:28:50 UTC

svn commit: r915287 - in /camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http: HttpComponent.java HttpEndpoint.java HttpPollingConsumer.java HttpProducer.java

Author: davsclaus
Date: Tue Feb 23 11:28:50 2010
New Revision: 915287

URL: http://svn.apache.org/viewvc?rev=915287&view=rev
Log:
CAMEL-1530: Using a shared HttpClient and ThreadSafeClientConnManager. Made it easier to configure maxTotalConnections and connectionsPerRoute. Shutting down properly.

Modified:
    camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java
    camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java
    camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpPollingConsumer.java
    camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java

Modified: camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java?rev=915287&r1=915286&r2=915287&view=diff
==============================================================================
--- camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java (original)
+++ camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java Tue Feb 23 11:28:50 2010
@@ -25,11 +25,14 @@
 import org.apache.camel.util.CastUtils;
 import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.URISupport;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.http.auth.params.AuthParamBean;
 import org.apache.http.client.params.ClientParamBean;
 import org.apache.http.conn.ClientConnectionManager;
 import org.apache.http.conn.params.ConnConnectionParamBean;
 import org.apache.http.conn.params.ConnManagerParamBean;
+import org.apache.http.conn.params.ConnPerRouteBean;
 import org.apache.http.conn.params.ConnRouteParamBean;
 import org.apache.http.conn.scheme.PlainSocketFactory;
 import org.apache.http.conn.scheme.Scheme;
@@ -49,10 +52,15 @@
  * @version $Revision$
  */
 public class HttpComponent extends HeaderFilterStrategyComponent {
+    private static final transient Log LOG = LogFactory.getLog(HttpComponent.class);
+
     protected HttpClientConfigurer httpClientConfigurer;
     protected ClientConnectionManager httpConnectionManager;
     protected HttpBinding httpBinding;
 
+    // options to the default created http connection manager
+    protected int maxTotalConnections = 200;
+    protected int connectionsPerRoute = 20;
 
     /**
      * Connects the URL specified on the endpoint to the specified processor.
@@ -124,7 +132,6 @@
 
         // validate that we could resolve all httpClient. parameters as this component is lenient
         validateParameters(uri, parameters, "httpClient.");
-
         configureParameters(parameters);
 
         // should we use an exception for failed error codes?
@@ -147,19 +154,14 @@
             }
         }
 
-        ClientConnectionManager connMgr = httpConnectionManager;
-        if (connMgr == null) {
-            SchemeRegistry schemeRegistry = new SchemeRegistry();
-            if (isSecureConnection(uri)) {
-                schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
-            } else {
-                schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
-            }
-
-            connMgr = new ThreadSafeClientConnManager(clientParams, schemeRegistry);
+        // create default connection manager if none provided
+        if (httpConnectionManager == null) {
+            httpConnectionManager = createConnectionManager(clientParams, uri);
         }
 
-        HttpEndpoint endpoint = new HttpEndpoint(uri, this, httpUri, clientParams, connMgr, httpClientConfigurer);
+        LOG.info("Using ClientConnectionManager: " + httpConnectionManager);
+
+        HttpEndpoint endpoint = new HttpEndpoint(uri, this, httpUri, clientParams, httpConnectionManager, httpClientConfigurer);
         if (httpBinding != null) {
             endpoint.setBinding(httpBinding);
         }
@@ -177,8 +179,40 @@
         return endpoint;
     }
 
-    private boolean isSecureConnection(String uri) {
-        return uri.startsWith("https");
+    protected ClientConnectionManager createConnectionManager(HttpParams clientParams, String uri) {
+        StringBuilder sb = new StringBuilder("Created ClientConnectionManager configured with");
+        ThreadSafeClientConnManager answer;
+
+        SchemeRegistry schemeRegistry = new SchemeRegistry();
+        if (isSecureConnection(uri)) {
+            schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
+        } else {
+            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
+        }
+
+        answer = new ThreadSafeClientConnManager(clientParams, schemeRegistry);
+
+        // configure additional configurations
+        ConnManagerParamBean param = new ConnManagerParamBean(clientParams);
+        if (getMaxTotalConnections() > 0) {
+            sb.append(" maxTotalConnections=" + getMaxTotalConnections());
+            param.setMaxTotalConnections(getMaxTotalConnections());
+        }
+        if (getConnectionsPerRoute() > 0) {
+            sb.append(" connectionsPerRoute=" + getConnectionsPerRoute());
+            param.setConnectionsPerRoute(new ConnPerRouteBean(getConnectionsPerRoute()));
+        }
+
+        // log information about the created connection manager
+        if (LOG.isDebugEnabled()) {
+            String msg = sb.toString();
+            if (msg.endsWith("with")) {
+                msg += " default values";
+            }
+            LOG.debug(msg + ": " + answer);
+        }
+
+        return answer;
     }
 
     protected HttpParams configureHttpParams(Map<String, Object> parameters) throws Exception {
@@ -211,6 +245,10 @@
         return clientParams;
     }
 
+    private boolean isSecureConnection(String uri) {
+        return uri.startsWith("https");
+    }
+
     @Override
     protected boolean useIntrospectionOnEndpoint() {
         return false;
@@ -240,4 +278,30 @@
         this.httpBinding = httpBinding;
     }
 
+    public int getMaxTotalConnections() {
+        return maxTotalConnections;
+    }
+
+    public void setMaxTotalConnections(int maxTotalConnections) {
+        this.maxTotalConnections = maxTotalConnections;
+    }
+
+    public int getConnectionsPerRoute() {
+        return connectionsPerRoute;
+    }
+
+    public void setConnectionsPerRoute(int connectionsPerRoute) {
+        this.connectionsPerRoute = connectionsPerRoute;
+    }
+
+    @Override
+    public void stop() throws Exception {
+        // shutdown connection manager
+        if (httpConnectionManager != null) {
+            LOG.info("Shutting down ClientConnectionManager: " + httpConnectionManager);
+            httpConnectionManager.shutdown();
+            httpConnectionManager = null;
+        }
+        super.stop();
+    }
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java?rev=915287&r1=915286&r2=915287&view=diff
==============================================================================
--- camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java (original)
+++ camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java Tue Feb 23 11:28:50 2010
@@ -50,6 +50,7 @@
     private HttpParams clientParams;
     private HttpClientConfigurer httpClientConfigurer;
     private ClientConnectionManager httpConnectionManager;
+    private HttpClient httpClient;
     private boolean throwExceptionOnFailure = true;
     private boolean bridgeEndpoint;
     private boolean matchOnUriPrefix;
@@ -85,9 +86,25 @@
     }
 
     /**
-     * Factory method used by producers and consumers to create a new {@link HttpClient} instance
+     * Gets the HttpClient to be used by {@link org.apache.camel.component.http.HttpProducer}
      */
-    public HttpClient createHttpClient() {
+    public synchronized HttpClient getHttpClient() {
+        if (httpClient == null) {
+            httpClient = createHttpClient();
+        }
+        return httpClient;
+    }
+
+    public void setHttpClient(HttpClient httpClient) {
+        this.httpClient = httpClient;
+    }
+
+    /**
+     * Factory method to create a new {@link HttpClient} instance
+     * <p/>
+     * Producers and consumers should use the {@link #getHttpClient()} method instead.
+     */
+    protected HttpClient createHttpClient() {
         ObjectHelper.notNull(clientParams, "clientParams");
         ObjectHelper.notNull(httpConnectionManager, "httpConnectionManager");
 
@@ -109,6 +126,10 @@
         if (configurer != null) {
             configurer.configureHttpClient(answer);
         }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Created HttpClient " + answer);
+        }
         return answer;
     }
 
@@ -248,4 +269,6 @@
     public void setChunked(boolean chunked) {
         this.chunked = chunked;
     }
+
+
 }

Modified: camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpPollingConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpPollingConsumer.java?rev=915287&r1=915286&r2=915287&view=diff
==============================================================================
--- camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpPollingConsumer.java (original)
+++ camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpPollingConsumer.java Tue Feb 23 11:28:50 2010
@@ -47,7 +47,7 @@
     public HttpPollingConsumer(HttpEndpoint endpoint) {
         super(endpoint);
         this.endpoint = endpoint;
-        httpClient = endpoint.createHttpClient();
+        this.httpClient = endpoint.getHttpClient();
     }
 
     public Exchange receive() {

Modified: camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java?rev=915287&r1=915286&r2=915287&view=diff
==============================================================================
--- camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java (original)
+++ camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java Tue Feb 23 11:28:50 2010
@@ -57,7 +57,7 @@
 
     public HttpProducer(HttpEndpoint endpoint) {
         super(endpoint);
-        this.httpClient = endpoint.createHttpClient();
+        this.httpClient = endpoint.getHttpClient();
         this.throwException = endpoint.isThrowExceptionOnFailure();
     }