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();
}