Avoid duplicate code. Added test.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/jcs/trunk@1779059 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java
index 05f17e7..f4e886d 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java
@@ -27,23 +27,46 @@
public final class PoolConfiguration
implements Cloneable
{
+ /**
+ * DEFAULT SETTINGS
+ */
+ private static final boolean DEFAULT_USE_BOUNDARY = true;
+
+ /** Default queue size limit */
+ private static final int DEFAULT_BOUNDARY_SIZE = 2000;
+
+ /** Default max size */
+ private static final int DEFAULT_MAXIMUM_POOL_SIZE = 150;
+
+ /** Default min */
+ private static final int DEFAULT_MINIMUM_POOL_SIZE = Runtime.getRuntime().availableProcessors();
+
+ /** Default keep alive */
+ private static final int DEFAULT_KEEPALIVE_TIME = 1000 * 60 * 5;
+
+ /** Default when blocked */
+ private static final WhenBlockedPolicy DEFAULT_WHEN_BLOCKED_POLICY = WhenBlockedPolicy.RUN;
+
+ /** Default startup size */
+ private static final int DEFAULT_STARTUP_SIZE = DEFAULT_MINIMUM_POOL_SIZE;
+
/** Should we bound the queue */
- private boolean useBoundary = true;
+ private boolean useBoundary = DEFAULT_USE_BOUNDARY;
/** If the queue is bounded, how big can it get */
- private int boundarySize = 2000;
+ private int boundarySize = DEFAULT_BOUNDARY_SIZE;
/** only has meaning if a boundary is used */
- private int maximumPoolSize = 150;
+ private int maximumPoolSize = DEFAULT_MAXIMUM_POOL_SIZE;
/**
* the exact number that will be used in a boundless queue. If the queue has a boundary, more
* will be created if the queue fills.
*/
- private int minimumPoolSize = 4;
+ private int minimumPoolSize = DEFAULT_MINIMUM_POOL_SIZE;
/** How long idle threads above the minimum should be kept alive. */
- private int keepAliveTime = 1000 * 60 * 5;
+ private int keepAliveTime = DEFAULT_KEEPALIVE_TIME;
public enum WhenBlockedPolicy {
/** abort when queue is full and max threads is reached. */
@@ -63,10 +86,10 @@
}
/** should be ABORT, BLOCK, RUN, WAIT, DISCARDOLDEST, */
- private WhenBlockedPolicy whenBlockedPolicy = WhenBlockedPolicy.RUN;
+ private WhenBlockedPolicy whenBlockedPolicy = DEFAULT_WHEN_BLOCKED_POLICY;
/** The number of threads to create on startup */
- private int startUpSize = 4;
+ private int startUpSize = DEFAULT_MINIMUM_POOL_SIZE;
/**
* @param useBoundary The useBoundary to set.
@@ -89,7 +112,9 @@
*/
public PoolConfiguration()
{
- // nop
+ this( DEFAULT_USE_BOUNDARY, DEFAULT_BOUNDARY_SIZE, DEFAULT_MAXIMUM_POOL_SIZE,
+ DEFAULT_MINIMUM_POOL_SIZE, DEFAULT_KEEPALIVE_TIME,
+ DEFAULT_WHEN_BLOCKED_POLICY, DEFAULT_STARTUP_SIZE );
}
/**
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java
index 4fd4b53..1d9cf1a 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java
@@ -27,7 +27,7 @@
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import org.apache.commons.jcs.utils.threadpool.PoolConfiguration.WhenBlockedPolicy;
+import org.apache.commons.jcs.utils.config.PropertySetter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -71,31 +71,8 @@
/** The logger */
private static final Log log = LogFactory.getLog( ThreadPoolManager.class );
- /**
- * DEFAULT SETTINGS
- */
- private static final boolean useBoundary_DEFAULT = true;
-
- /** Default queue size limit */
- private static final int boundarySize_DEFAULT = 2000;
-
- /** Default max size */
- private static final int maximumPoolSize_DEFAULT = 150;
-
- /** Default min */
- private static final int minimumPoolSize_DEFAULT = Runtime.getRuntime().availableProcessors();
-
- /** Default keep alive */
- private static final int keepAliveTime_DEFAULT = 1000 * 60 * 5;
-
- /** Default when blocked */
- private static final WhenBlockedPolicy whenBlockedPolicy_DEFAULT = WhenBlockedPolicy.RUN;
-
- /** Default startup size */
- private static final int startUpSize_DEFAULT = minimumPoolSize_DEFAULT;
-
/** The default config, created using property defaults if present, else those above. */
- private static PoolConfiguration defaultConfig;
+ private PoolConfiguration defaultConfig;
/** the root property name */
private static final String PROP_NAME_ROOT = "thread_pool";
@@ -285,7 +262,7 @@
/**
* Initialize the ThreadPoolManager and create all the pools defined in the configuration.
*/
- private static void configure()
+ private void configure()
{
if ( log.isDebugEnabled() )
{
@@ -300,10 +277,7 @@
// set intial default and then override if new
// settings are available
- defaultConfig = new PoolConfiguration( useBoundary_DEFAULT, boundarySize_DEFAULT, maximumPoolSize_DEFAULT,
- minimumPoolSize_DEFAULT, keepAliveTime_DEFAULT,
- whenBlockedPolicy_DEFAULT, startUpSize_DEFAULT );
-
+ defaultConfig = new PoolConfiguration();
defaultConfig = loadConfig( DEFAULT_PROP_NAME_ROOT );
}
@@ -313,75 +287,14 @@
* @param root
* @return PoolConfiguration
*/
- private static PoolConfiguration loadConfig( String root )
+ private PoolConfiguration loadConfig( String root )
{
PoolConfiguration config = defaultConfig.clone();
+ PropertySetter.setProperties( config, props, root + "." );
- try
+ if ( log.isDebugEnabled() )
{
- config.setUseBoundary( Boolean.parseBoolean( props.getProperty( root + ".useBoundary", "false" ) ) );
- }
- catch ( NumberFormatException nfe )
- {
- log.error( "useBoundary not a boolean.", nfe );
- }
-
- // load default if they exist
- try
- {
- config.setBoundarySize( Integer.parseInt( props.getProperty( root + ".boundarySize", "2000" ) ) );
- }
- catch ( NumberFormatException nfe )
- {
- log.error( "boundarySize not a number.", nfe );
- }
-
- // maximum pool size
- try
- {
- config.setMaximumPoolSize( Integer.parseInt( props.getProperty( root + ".maximumPoolSize", "150" ) ) );
- }
- catch ( NumberFormatException nfe )
- {
- log.error( "maximumPoolSize not a number.", nfe );
- }
-
- // minimum pool size
- try
- {
- config.setMinimumPoolSize( Integer.parseInt( props.getProperty( root + ".minimumPoolSize", "4" ) ) );
- }
- catch ( NumberFormatException nfe )
- {
- log.error( "minimumPoolSize not a number.", nfe );
- }
-
- // keep alive
- try
- {
- config.setKeepAliveTime( Integer.parseInt( props.getProperty( root + ".keepAliveTime", "300000" ) ) );
- }
- catch ( NumberFormatException nfe )
- {
- log.error( "keepAliveTime not a number.", nfe );
- }
-
- // when blocked
- config.setWhenBlockedPolicy( props.getProperty( root + ".whenBlockedPolicy", "RUN" ) );
-
- // startupsize
- try
- {
- config.setStartUpSize( Integer.parseInt( props.getProperty( root + ".startUpSize", "4" ) ) );
- }
- catch ( NumberFormatException nfe )
- {
- log.error( "startUpSize not a number.", nfe );
- }
-
- if ( log.isInfoEnabled() )
- {
- log.info( root + " PoolConfiguration = " + config );
+ log.debug( root + " PoolConfiguration = " + config );
}
return config;
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManagerUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManagerUnitTest.java
index e2210a1..a1bed66 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManagerUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManagerUnitTest.java
@@ -21,12 +21,14 @@
import java.util.ArrayList;
import java.util.Properties;
+import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
-
-import junit.framework.TestCase;
+import java.util.concurrent.TimeUnit;
import org.apache.commons.jcs.utils.props.PropertyLoader;
+import junit.framework.TestCase;
+
/**
* Verify that the manager can create pools as intended by the default and
* specified file names.
@@ -63,6 +65,39 @@
}
/**
+ * Make sure it can load a certain configuration
+ */
+ public void testSpecialConfig()
+ {
+ Properties props = PropertyLoader.loadProperties( "thread_pool.properties" );
+ ThreadPoolManager.setProps( props );
+ ThreadPoolManager mgr = ThreadPoolManager.getInstance();
+ assertNotNull( mgr );
+
+ ThreadPoolExecutor pool = mgr.getPool( "aborttest" );
+ assertNotNull( pool );
+
+ int poolSize = pool.getCorePoolSize();
+ int expectedPoolSize = Integer.parseInt( props.getProperty( "thread_pool.aborttest.startUpSize" ) );
+ assertEquals( expectedPoolSize, poolSize);
+
+ int minPoolSize = pool.getPoolSize();
+ int expectedMinPoolSize = Integer.parseInt( props.getProperty( "thread_pool.aborttest.minimumPoolSize" ) );
+ assertEquals( expectedMinPoolSize, minPoolSize );
+
+ int maxPoolSize = pool.getMaximumPoolSize();
+ int expectedMaxPoolSize = Integer.parseInt( props.getProperty( "thread_pool.aborttest.maximumPoolSize" ) );
+ assertEquals( expectedMaxPoolSize, maxPoolSize );
+
+ long keepAliveTime = pool.getKeepAliveTime(TimeUnit.MILLISECONDS);
+ long expectedKeepAliveTime = Long.parseLong( props.getProperty( "thread_pool.aborttest.keepAliveTime" ) );
+ assertEquals( expectedKeepAliveTime, keepAliveTime );
+
+ RejectedExecutionHandler whenBlockedPolicy = pool.getRejectedExecutionHandler();
+ assertTrue( whenBlockedPolicy instanceof ThreadPoolExecutor.AbortPolicy );
+ }
+
+ /**
* Try to get an undefined pool from an existing default file.
*/
public void testDefaultConfigUndefinedPool()
diff --git a/commons-jcs-core/src/test/test-conf/thread_pool.properties b/commons-jcs-core/src/test/test-conf/thread_pool.properties
index cbf5284..b6a3326 100644
--- a/commons-jcs-core/src/test/test-conf/thread_pool.properties
+++ b/commons-jcs-core/src/test/test-conf/thread_pool.properties
@@ -44,13 +44,13 @@
thread_pool.maxtest.whenBlockedPolicy=RUN
thread_pool.maxtest.startUpSize=5
-# wait test thread pool config
-thread_pool.waittest.boundarySize=1
-thread_pool.waittest.maximumPoolSize=11
-thread_pool.waittest.minimumPoolSize=1
-thread_pool.waittest.keepAliveTime=1
-thread_pool.waittest.whenBlockedPolicy=WAIT
-thread_pool.waittest.startUpSize=1
+# abort test thread pool config
+thread_pool.aborttest.boundarySize=1
+thread_pool.aborttest.maximumPoolSize=11
+thread_pool.aborttest.minimumPoolSize=1
+thread_pool.aborttest.keepAliveTime=1
+thread_pool.aborttest.whenBlockedPolicy=ABORT
+thread_pool.aborttest.startUpSize=1
# with boundary test thread pool config
thread_pool.withbound.useBoundary=true
@@ -58,7 +58,7 @@
thread_pool.withbound.maximumPoolSize=11
thread_pool.withbound.minimumPoolSize=1
thread_pool.withbound.keepAliveTime=1
-thread_pool.withbound.whenBlockedPolicy=WAIT
+thread_pool.withbound.whenBlockedPolicy=ABORT
thread_pool.withbound.startUpSize=1
@@ -68,5 +68,5 @@
thread_pool.nobound.maximumPoolSize=11
thread_pool.nobound.minimumPoolSize=1
thread_pool.nobound.keepAliveTime=1
-thread_pool.nobound.whenBlockedPolicy=WAIT
+thread_pool.nobound.whenBlockedPolicy=ABORT
thread_pool.nobound.startUpSize=1