diff --git a/core/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java b/core/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java index 35ac2530..5ab605a1 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java +++ b/core/src/main/java/org/springframework/ws/transport/http/CommonsHttpMessageSender.java @@ -18,12 +18,18 @@ package org.springframework.ws.transport.http; import java.io.IOException; import java.net.URI; +import java.util.Iterator; +import java.util.Properties; import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpConnectionManager; +import org.apache.commons.httpclient.HttpURL; +import org.apache.commons.httpclient.HttpsURL; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.NTCredentials; +import org.apache.commons.httpclient.URIException; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.PostMethod; @@ -131,6 +137,59 @@ public class CommonsHttpMessageSender extends AbstractHttpWebServiceMessageSende getHttpClient().getHttpConnectionManager().getParams().setSoTimeout(timeout); } + /** + * Sets the maximum number of connections allowed for the underlying HttpClient. + * + * @param maxTotalConnections the maximum number of connections allowed + * @see org.apache.commons.httpclient.params.HttpConnectionManagerParams#setMaxTotalConnections(int) + */ + public void setMaxTotalConnections(int maxTotalConnections) { + if (maxTotalConnections <= 0) { + throw new IllegalArgumentException("maxTotalConnections must be a positive value"); + } + getHttpClient().getHttpConnectionManager().getParams().setMaxTotalConnections(maxTotalConnections); + } + + /** + * Sets the maximum number of connections per host for the underlying HttpClient. The maximum number of connections + * per host can be set in a form accepted by the {@code java.util.Properties} class, like as follows: + *
+     * https://www.example.com=1
+     * http://www.example.com:8080=7
+     * www.springframework.org=10
+     * *=5
+     * 
+ * The host can be specified as hostname, or as URI (with scheme and port). The special host name {@code *} can be + * used to specify {@link org.apache.commons.httpclient.HostConfiguration#ANY_HOST_CONFIGURATION}. + * + * @param maxConnectionsPerHost a properties object specifying the maximum number of connection + * @see org.apache.commons.httpclient.params.HttpConnectionManagerParams#setMaxConnectionsPerHost(org.apache.commons.httpclient.HostConfiguration, + * int) + */ + public void setMaxConnectionsPerHost(Properties maxConnectionsPerHost) throws URIException { + for (Iterator iterator = maxConnectionsPerHost.keySet().iterator(); iterator.hasNext();) { + String host = (String) iterator.next(); + HostConfiguration hostConfiguration = new HostConfiguration(); + if ("*".equals(host)) { + hostConfiguration = HostConfiguration.ANY_HOST_CONFIGURATION; + } + else if (host.startsWith("http://")) { + HttpURL httpURL = new HttpURL(host); + hostConfiguration.setHost(httpURL); + } + else if (host.startsWith("https://")) { + HttpsURL httpsURL = new HttpsURL(host); + hostConfiguration.setHost(httpsURL); + } + else { + hostConfiguration.setHost(host); + } + int maxHostConnections = Integer.parseInt(maxConnectionsPerHost.getProperty(host)); + getHttpClient().getHttpConnectionManager().getParams() + .setMaxConnectionsPerHost(hostConfiguration, maxHostConnections); + } + } + /** * Returns the authentication scope to be used. Only used when the credentials property has been set. *

diff --git a/core/src/test/java/org/springframework/ws/transport/http/CommonsHttpMessageSenderIntegrationTest.java b/core/src/test/java/org/springframework/ws/transport/http/CommonsHttpMessageSenderIntegrationTest.java index a2c0bc85..b8a53845 100644 --- a/core/src/test/java/org/springframework/ws/transport/http/CommonsHttpMessageSenderIntegrationTest.java +++ b/core/src/test/java/org/springframework/ws/transport/http/CommonsHttpMessageSenderIntegrationTest.java @@ -17,8 +17,11 @@ package org.springframework.ws.transport.http; import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; import org.apache.commons.httpclient.ConnectTimeoutException; +import org.apache.commons.httpclient.URIException; import org.springframework.ws.MockWebServiceMessage; import org.springframework.ws.WebServiceMessage; @@ -44,4 +47,15 @@ public class CommonsHttpMessageSenderIntegrationTest extends AbstractHttpWebServ } } + public void testMaxConnections() throws URISyntaxException, URIException { + CommonsHttpMessageSender messageSender = new CommonsHttpMessageSender(); + messageSender.setMaxTotalConnections(2); + Properties maxConnectionsPerHost = new Properties(); + maxConnectionsPerHost.setProperty("https://www.example.com", "1"); + maxConnectionsPerHost.setProperty("http://www.example.com:8080", "7"); + maxConnectionsPerHost.setProperty("www.springframework.org", "10"); + maxConnectionsPerHost.setProperty("*", "5"); + messageSender.setMaxConnectionsPerHost(maxConnectionsPerHost); + } + }