You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2013/10/11 16:09:57 UTC

svn commit: r1531299 - /commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java

Author: markt
Date: Fri Oct 11 14:09:57 2013
New Revision: 1531299

URL: http://svn.apache.org/r1531299
Log:
Allow the AbandonedConfig to be disabled as well as changed while the pool is running.
Make changes to AbandonedConfig thread safe.

Modified:
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java

Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1531299&r1=1531298&r2=1531299&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java Fri Oct 11 14:09:57 2013
@@ -33,6 +33,7 @@ import org.apache.commons.pool2.PooledOb
 import org.apache.commons.pool2.PooledObjectState;
 import org.apache.commons.pool2.SwallowedExceptionListener;
 import org.apache.commons.pool2.TrackedUse;
+import org.apache.commons.pool2.UsageTracking;
 
 /**
  * A configurable {@link ObjectPool} implementation.
@@ -76,7 +77,7 @@ import org.apache.commons.pool2.TrackedU
  * @since 2.0
  */
 public class GenericObjectPool<T> extends BaseGenericObjectPool<T>
-        implements ObjectPool<T>, GenericObjectPoolMXBean {
+        implements ObjectPool<T>, GenericObjectPoolMXBean, UsageTracking<T> {
 
     /**
      * Create a new <code>GenericObjectPool</code> using defaults from
@@ -233,7 +234,8 @@ public class GenericObjectPool<T> extend
      */
     @Override
     public boolean getLogAbandoned() {
-        return isAbandonedConfig() && abandonedConfig.getLogAbandoned();
+        AbandonedConfig ac = this.abandonedConfig;
+        return ac != null && ac.getLogAbandoned();
     }
 
     /**
@@ -244,8 +246,8 @@ public class GenericObjectPool<T> extend
      */
     @Override
     public boolean getRemoveAbandonedOnBorrow() {
-        return isAbandonedConfig() &&
-        abandonedConfig.getRemoveAbandonedOnBorrow();
+        AbandonedConfig ac = this.abandonedConfig;
+        return ac != null && ac.getRemoveAbandonedOnBorrow();
     }
 
     /**
@@ -256,8 +258,8 @@ public class GenericObjectPool<T> extend
      */
     @Override
     public boolean getRemoveAbandonedOnMaintenance() {
-        return isAbandonedConfig() &&
-        abandonedConfig.getRemoveAbandonedOnMaintenance();
+        AbandonedConfig ac = this.abandonedConfig;
+        return ac != null && ac.getRemoveAbandonedOnMaintenance();
     }
 
     /**
@@ -268,9 +270,8 @@ public class GenericObjectPool<T> extend
      */
     @Override
     public int getRemoveAbandonedTimeout() {
-        return isAbandonedConfig() ?
-                abandonedConfig.getRemoveAbandonedTimeout() :
-                    Integer.MAX_VALUE;
+        AbandonedConfig ac = this.abandonedConfig;
+        return ac != null ? ac.getRemoveAbandonedTimeout() : Integer.MAX_VALUE;
     }
 
 
@@ -308,12 +309,16 @@ public class GenericObjectPool<T> extend
      * @see AbandonedConfig
      */
     public void setAbandonedConfig(AbandonedConfig abandonedConfig) throws IllegalArgumentException {
-        this.abandonedConfig = new AbandonedConfig();
-        this.abandonedConfig.setLogAbandoned(abandonedConfig.getLogAbandoned());
-        this.abandonedConfig.setLogWriter(abandonedConfig.getLogWriter());
-        this.abandonedConfig.setRemoveAbandonedOnBorrow(abandonedConfig.getRemoveAbandonedOnBorrow());
-        this.abandonedConfig.setRemoveAbandonedOnMaintenance(abandonedConfig.getRemoveAbandonedOnMaintenance());
-        this.abandonedConfig.setRemoveAbandonedTimeout(abandonedConfig.getRemoveAbandonedTimeout());
+        if (abandonedConfig == null) {
+            this.abandonedConfig = null;
+        } else {
+            this.abandonedConfig = new AbandonedConfig();
+            this.abandonedConfig.setLogAbandoned(abandonedConfig.getLogAbandoned());
+            this.abandonedConfig.setLogWriter(abandonedConfig.getLogWriter());
+            this.abandonedConfig.setRemoveAbandonedOnBorrow(abandonedConfig.getRemoveAbandonedOnBorrow());
+            this.abandonedConfig.setRemoveAbandonedOnMaintenance(abandonedConfig.getRemoveAbandonedOnMaintenance());
+            this.abandonedConfig.setRemoveAbandonedTimeout(abandonedConfig.getRemoveAbandonedTimeout());
+        }
     }
 
     /**
@@ -379,11 +384,11 @@ public class GenericObjectPool<T> extend
     public T borrowObject(long borrowMaxWaitMillis) throws Exception {
         assertOpen();
 
-        if (isAbandonedConfig() &&
-                abandonedConfig.getRemoveAbandonedOnBorrow() &&
+        AbandonedConfig ac = this.abandonedConfig;
+        if (ac != null && ac.getRemoveAbandonedOnBorrow() &&
                 (getNumIdle() < 2) &&
                 (getNumActive() > getMaxTotal() - 3) ) {
-            removeAbandoned();
+            removeAbandoned(ac);
         }
 
         PooledObject<T> p = null;
@@ -771,8 +776,9 @@ public class GenericObjectPool<T> extend
                 }
             }
         }
-        if (isAbandonedConfig() && abandonedConfig.getRemoveAbandonedOnMaintenance()) {
-            removeAbandoned();
+        AbandonedConfig ac = this.abandonedConfig;
+        if (ac != null && ac.getRemoveAbandonedOnMaintenance()) {
+            removeAbandoned(ac);
         }
     }
 
@@ -793,7 +799,8 @@ public class GenericObjectPool<T> extend
             throw e;
         }
 
-        if (isAbandonedConfig() && abandonedConfig.getLogAbandoned()) {
+        AbandonedConfig ac = this.abandonedConfig;
+        if (ac != null && ac.getLogAbandoned()) {
             p.setLogAbandoned(true);
         }
 
@@ -876,11 +883,11 @@ public class GenericObjectPool<T> extend
      * Recover abandoned objects which have been checked out but
      * not used since longer than the removeAbandonedTimeout.
      */
-    private void removeAbandoned() {
+    private void removeAbandoned(AbandonedConfig ac) {
         // Generate a list of abandoned objects to remove
         final long now = System.currentTimeMillis();
         final long timeout =
-                now - (abandonedConfig.getRemoveAbandonedTimeout() * 1000L);
+                now - (ac.getRemoveAbandonedTimeout() * 1000L);
         ArrayList<PooledObject<T>> remove = new ArrayList<PooledObject<T>>();
         Iterator<PooledObject<T>> it = allObjects.values().iterator();
         while (it.hasNext()) {
@@ -898,8 +905,8 @@ public class GenericObjectPool<T> extend
         Iterator<PooledObject<T>> itr = remove.iterator();
         while (itr.hasNext()) {
             PooledObject<T> pooledObject = itr.next();
-            if (abandonedConfig.getLogAbandoned()) {
-                pooledObject.printStackTrace(abandonedConfig.getLogWriter());
+            if (ac.getLogAbandoned()) {
+                pooledObject.printStackTrace(ac.getLogWriter());
             }
             try {
                 invalidateObject(pooledObject.getObject());
@@ -909,6 +916,15 @@ public class GenericObjectPool<T> extend
         }
     }
 
+
+    //--- Usage tracking support -----------------------------------------------
+
+    @Override
+    public void use(T pooledObject) {
+        // TODO Auto-generated method stub
+    }
+
+
     //--- JMX support ----------------------------------------------------------
 
     private volatile String factoryType = null;