Author: gawor
Date: Tue Jul 13 13:32:24 2010
New Revision: 963710

URL: http://svn.apache.org/viewvc?rev=963710&view=rev
Log:
AXIS2-4751: Create a new instance of HttpClient since it is not used in 
thread-safe way. The connection manager is not automatically reused right now 
because other bugs in Axis2 or related libraries cause test failures when 
connection reuse is enabled.

Modified:
    
axis/axis2/java/core/trunk/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java

Modified: 
axis/axis2/java/core/trunk/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java?rev=963710&r1=963709&r2=963710&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
 Tue Jul 13 13:32:24 2010
@@ -25,12 +25,12 @@ import org.apache.axiom.om.OMOutputForma
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.OperationContext;
 import org.apache.axis2.description.TransportOutDescription;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.transport.MessageFormatter;
 import org.apache.axis2.transport.TransportUtils;
-import org.apache.axis2.util.JavaUtils;
 import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.Header;
@@ -485,44 +485,55 @@ public abstract class AbstractHTTPSender
     }
 
     protected HttpClient getHttpClient(MessageContext msgContext) {
-        HttpClient httpClient;
-        Object reuse = 
msgContext.getOptions().getProperty(HTTPConstants.REUSE_HTTP_CLIENT);
-        if (reuse == null) {
-            reuse = 
msgContext.getConfigurationContext().getProperty(HTTPConstants.REUSE_HTTP_CLIENT);
-        }
-        if (reuse != null && JavaUtils.isTrueExplicitly(reuse)) {
-            httpClient = (HttpClient) 
msgContext.getOptions().getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
-            if (httpClient == null) {
-                httpClient = (HttpClient) msgContext.getConfigurationContext()
-                        .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
-            }
-            if (httpClient != null)
-                return httpClient;
-            MultiThreadedHttpConnectionManager connectionManager =
-                new MultiThreadedHttpConnectionManager();
-            httpClient = new HttpClient(connectionManager);
-            msgContext.getConfigurationContext()
-                .setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
-        } else {
-            HttpConnectionManager connManager =
-                    (HttpConnectionManager) msgContext.getProperty(
-                            HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
-            if (connManager == null) {
-                connManager =
-                        (HttpConnectionManager) msgContext.getProperty(
-                                
HTTPConstants.MUTTITHREAD_HTTP_CONNECTION_MANAGER);
-            }
-            if(connManager != null){
-                httpClient = new HttpClient(connManager);
-            } else {
-                //Multi threaded http connection manager has set as the 
default 
-                connManager = new MultiThreadedHttpConnectionManager();
-                httpClient = new HttpClient(connManager);
+        ConfigurationContext configContext = 
msgContext.getConfigurationContext();
+
+        HttpClient httpClient = (HttpClient) 
msgContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
+        if (httpClient == null) {
+            httpClient = (HttpClient) 
configContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
+        }
+        if (httpClient != null) {
+            return httpClient;
+        }
+
+        HttpConnectionManager connManager =
+            (HttpConnectionManager) msgContext.getProperty(
+                 HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
+        if (connManager == null) {
+            connManager =
+                (HttpConnectionManager) msgContext.getProperty(
+                     HTTPConstants.MUTTITHREAD_HTTP_CONNECTION_MANAGER);
+        }
+        if (connManager == null) {
+            // reuse HttpConnectionManager
+            synchronized (configContext) {
+                connManager = (HttpConnectionManager) 
configContext.getProperty(
+                                   
HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
+                if (connManager == null) {
+                    log.trace("Making new ConnectionManager");
+                    connManager = new MultiThreadedHttpConnectionManager();    
                
+                    /* 
+                     * Commented out for now as bugs in other parts of Axis2 
cause test failures when
+                     * proper connection reuse is enabled. 
+                     */
+                    // 
configContext.setProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER, 
+                    //                           connManager);
+                    
+                }
             }
         }
 
+        /*
+         * Create a new instance of HttpClient since it is not
+         * used in thread-safe way here. 
+         */
+        httpClient = new HttpClient(connManager);
+
+        // Set the default timeout in case we have a connection pool 
starvation to 30sec
+        httpClient.getParams().setConnectionManagerTimeout(30000);
+
         // Get the timeout values set in the runtime
         initializeTimeouts(msgContext, httpClient);
+
         return httpClient;
     }
 


Reply via email to