Author: dims
Date: Fri May 11 06:20:49 2007
New Revision: 537188

URL: http://svn.apache.org/viewvc?view=rev&rev=537188
Log:
- Separate out the anonymous class for ThreadFactory into its own static inner 
class named DefaultThreadFactory
- If the user specified upper bound to # of threads then switch the algorithm 
to wait for a thread to become free and use it. By default, we create a new 
thread everytime.
- Add HTTPConstants.AUTO_RELEASE_CONNECTION parameter to automatically call 
releaseConnection for all the sendVia* methods to cleanup connections.
  (This is an effort to deal with AXIS2-935 and AXIS2-2593)
  

Modified:
    
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPConstants.java
    
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPSender.java
    
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/threadpool/ThreadPool.java

Modified: 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPConstants.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPConstants.java?view=diff&rev=537188&r1=537187&r2=537188
==============================================================================
--- 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPConstants.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPConstants.java
 Fri May 11 06:20:49 2007
@@ -490,6 +490,11 @@
     public static final String OMIT_SOAP_12_ACTION = "OmitSOAP12Action";
     public static final String CUSTOM_PROTOCOL_HANDLER = 
"CUSTOM_PROTOCOL_HANDLER";
 
+    /*
+     * Automatically release connections.
+     */
+    public static final String AUTO_RELEASE_CONNECTION = 
"AutoReleaseConnection" ;
+
     /**
      * Method getBytes.
      *

Modified: 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPSender.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPSender.java?view=diff&rev=537188&r1=537187&r2=537188
==============================================================================
--- 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPSender.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/HTTPSender.java
 Fri May 11 06:20:49 2007
@@ -21,6 +21,7 @@
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
+import org.apache.axis2.util.JavaUtils;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.transport.MessageFormatter;
@@ -32,6 +33,7 @@
 import org.apache.commons.httpclient.HttpVersion;
 import org.apache.commons.httpclient.URI;
 import org.apache.commons.httpclient.URIException;
+import org.apache.commons.httpclient.HttpMethod;
 import org.apache.commons.httpclient.methods.DeleteMethod;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.PostMethod;
@@ -105,9 +107,16 @@
         } catch (IOException e) {
             log.info("Unable to sendViaGet to url[" + url + "]", e);
             throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, getMethod);
         }
+    }
 
-
+    private void cleanup(MessageContext msgContext, HttpMethod method) {
+        Object autoClose = 
msgContext.getOptions().getProperty(HTTPConstants.AUTO_RELEASE_CONNECTION);
+        if (autoClose != null && JavaUtils.isTrueExplicitly(autoClose)) {
+            method.releaseConnection();
+        }
     }
 
     /**
@@ -131,8 +140,9 @@
         } catch (IOException e) {
             log.info("Unable to sendViaDelete to url[" + url + "]", e);
             throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, deleteMethod);
         }
-
     }
 
     /**
@@ -183,8 +193,9 @@
         } catch (IOException e) {
             log.info("Unable to sendViaPost to url[" + url + "]", e);
             throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, postMethod);
         }
-
     }
 
     /**
@@ -236,6 +247,8 @@
         } catch (IOException e) {
             log.info("Unable to sendViaPut to url[" + url + "]", e);
             throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, putMethod);
         }
     }
 

Modified: 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/threadpool/ThreadPool.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/threadpool/ThreadPool.java?view=diff&rev=537188&r1=537187&r2=537188
==============================================================================
--- 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/threadpool/ThreadPool.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/threadpool/ThreadPool.java
 Fri May 11 06:20:49 2007
@@ -18,6 +18,7 @@
 package org.apache.axis2.util.threadpool;
 
 import edu.emory.mathcs.backport.java.util.concurrent.Executor;
+import edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue;
 import edu.emory.mathcs.backport.java.util.concurrent.SynchronousQueue;
 import edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor;
 import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
@@ -99,53 +100,59 @@
     protected ThreadPoolExecutor createDefaultExecutor(final String name,
                                                        final int priority,
                                                        final boolean daemon) {
-        ThreadPoolExecutor rc = new ThreadPoolExecutor(corePoolSize, 
maxPoolSize, 10,
-                                                       TimeUnit.SECONDS, new 
SynchronousQueue(),
-                                                       new 
edu.emory.mathcs.backport.java.util.concurrent.ThreadFactory() {
-                                                           public Thread 
newThread(
-                                                                   final 
Runnable runnable) {
-                                                               // do the 
following section as privileged
-                                                               // so that it 
will work even when java2 security
-                                                               // has been 
enabled
-                                                               Thread 
returnThread = null;
-                                                               try {
-                                                                   
returnThread =
-                                                                           
(Thread) AccessController
-                                                                               
    .doPrivileged(
-                                                                               
            new PrivilegedExceptionAction() {
-                                                                               
                public Object run() {
-                                                                               
                    Thread newThread =
-                                                                               
                            new Thread(
-                                                                               
                                    runnable,
-                                                                               
                                    name);
-                                                                               
                    newThread
-                                                                               
                            .setDaemon(
-                                                                               
                                    daemon);
-                                                                               
                    newThread
-                                                                               
                            .setPriority(
-                                                                               
                                    priority);
-                                                                               
                    return newThread;
-                                                                               
                }
-                                                                               
            }
-                                                                               
    );
-                                                               }
-                                                               catch 
(PrivilegedActionException e) {
-                                                                   // note: 
inner class can't have its own static log variable
-                                                                   if 
(log.isDebugEnabled()) {
-                                                                       
log.debug(
-                                                                               
"ThreadPoolExecutor.newThread():   Exception from AccessController [" +
-                                                                               
        e.getClass()
-                                                                               
                .getName() +
-                                                                               
        "]  for [" +
-                                                                               
        e.getMessage() +
-                                                                               
        "]", e);
-                                                                   }
-                                                               }
-                                                               return 
returnThread;
-
-                                                           }
-                                                       });
+        ThreadPoolExecutor rc;
+        if (maxPoolSize == Integer.MAX_VALUE) {
+            rc = new ThreadPoolExecutor(corePoolSize, maxPoolSize, 10,
+                    TimeUnit.SECONDS, new SynchronousQueue(),
+                    new DefaultThreadFactory(name, daemon, priority));
+        } else {
+            rc = new ThreadPoolExecutor(corePoolSize, maxPoolSize, 10,
+                    TimeUnit.SECONDS, new LinkedBlockingQueue(),
+                    new DefaultThreadFactory(name, daemon, priority));
+        }
         rc.allowCoreThreadTimeOut(true);
         return rc;
+    }
+
+    private static class DefaultThreadFactory implements 
edu.emory.mathcs.backport.java.util.concurrent.ThreadFactory {
+        private final String name;
+        private final boolean daemon;
+        private final int priority;
+
+        public DefaultThreadFactory(String name, boolean daemon, int priority) 
{
+            this.name = name;
+            this.daemon = daemon;
+            this.priority = priority;
+        }
+
+        public Thread newThread(
+                final Runnable runnable) {
+            // do the following section as privileged
+            // so that it will work even when java2 security
+            // has been enabled
+            Thread returnThread = null;
+            try {
+                returnThread = (Thread)
+                        AccessController.doPrivileged(new 
PrivilegedExceptionAction() {
+                            public Object run() {
+                                Thread newThread =
+                                        new Thread(runnable, name);
+                                newThread.setDaemon(daemon);
+                                newThread.setPriority(priority);
+                                return newThread;
+                            }
+                        }
+                        );
+            }
+            catch (PrivilegedActionException e) {
+                // note: inner class can't have its own static log variable
+                if (log.isDebugEnabled()) {
+                    log.debug("ThreadPoolExecutor.newThread():   Exception 
from AccessController [" + e.getClass()
+                            .getName() + "]  for [" + e.getMessage() + "]", e);
+                }
+            }
+            return returnThread;
+
+        }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to