Author: vgritsenko
Date: Thu Feb 24 11:05:25 2005
New Revision: 155225
URL: http://svn.apache.org/viewcvs?view=rev&rev=155225
Log:
Runnable Manager: Fix bug preventing scheduling of two different jobs at the
same time.
Modified:
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/thread/DefaultRunnableManager.java
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultRunnableManagerTestCase.java
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadFactoryTestCase.java
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadPoolTestCase.java
cocoon/branches/BRANCH_2_1_X/status.xml
Modified:
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/thread/DefaultRunnableManager.java
URL:
http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/thread/DefaultRunnableManager.java?view=diff&r1=155224&r2=155225
==============================================================================
---
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/thread/DefaultRunnableManager.java
(original)
+++
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/thread/DefaultRunnableManager.java
Thu Feb 24 11:05:25 2005
@@ -30,18 +30,17 @@
import java.util.SortedSet;
import java.util.TreeSet;
-
/**
* The DefaultRunnableManager implements the [EMAIL PROTECTED]
RunnableManager} interface
* and is responsible to create [EMAIL PROTECTED] ThreadPool}s and run [EMAIL
PROTECTED] Runnable}s
* in them as background commands.
- *
+ *
* <p>
* The configuration of the <code>DefaultRunnableManager</code>:
* <pre>
*
<thread-factory>org.apache.cocoon.components.thread.DefaultThreadFactory</thread-factory>
* <thread-pools>
- * <thread-pool>
+ * <thread-pool>
* <name>default</name>
* <priority>NORM</priority>
* <daemon>false</daemon>
@@ -52,11 +51,11 @@
* <block-policy>RUN</block-policy>
* <shutdown-graceful>false</shutdown-graceful>
* <shutdown-wait-time-ms>-1</shutdown-wait-time-ms>
- * </thread-pool>
+ * </thread-pool>
* </thread-pools>
* </pre>
* </p>
- *
+ *
* <p>
* Have a look at
*
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/PooledExecutor.html,
@@ -329,8 +328,8 @@
if( getLogger( ).isDebugEnabled( ) )
{
getLogger( ).debug( "Command entered: " + command.toString( ) +
- ",pool=" + pool.getName( ) + ",delay=" +
- delay + ",interval=" + interval );
+ ", pool=" + pool.getName( ) + ", delay=" +
+ delay + ", interval=" + interval );
}
new ExecutionInfo( pool, command, delay, interval, getLogger( ) );
@@ -500,16 +499,15 @@
*
* @throws Exception DOCUMENT ME!
*/
- public void start( )
- throws Exception
+ public void start( ) throws Exception
{
if( getLogger( ).isDebugEnabled( ) )
{
- getLogger( ).debug( "starting heart" );
+ getLogger( ).debug( "Starting the heart" );
}
m_keepRunning = true;
- ( (ThreadPool)m_pools.get( DEFAULT_THREADPOOL_NAME ) ).execute( this );
+ ( (ThreadPool) m_pools.get( DEFAULT_THREADPOOL_NAME ) ).execute( this
);
}
/**
@@ -578,7 +576,7 @@
int minPoolSize =
config.getChild( "min-pool-size" ).getValueAsInteger(
DEFAULT_MIN_POOL_SIZE );
- // make sure we have enough threads for the default thread pool as we
+ // make sure we have enough threads for the default thread pool as we
// need one for ourself
if( DEFAULT_THREADPOOL_NAME.equals( name ) &&
( ( minPoolSize > 0 ) && ( minPoolSize < DEFAULT_MIN_POOL_SIZE ) )
)
@@ -644,7 +642,6 @@
pool.setName( name );
ThreadFactory factory = null;
-
try
{
factory =
@@ -691,7 +688,6 @@
}
printPoolInfo( pool );
-
return pool;
}
@@ -743,8 +739,7 @@
* @author <a href="mailto:giacomo.at.apache.org">Giacomo Pati</a>
* @version $Id: DefaultRunnableManager.java 56848 2004-11-07 14:09:23Z
giacomo $
*/
- private class ExecutionInfo
- implements Comparable
+ private class ExecutionInfo implements Comparable
{
//~ Instance fields
----------------------------------------------------
@@ -810,8 +805,17 @@
public int compareTo( final Object other )
{
final ExecutionInfo otherInfo = (ExecutionInfo)other;
-
- return (int)( m_nextRun - otherInfo.m_nextRun );
+ int diff = (int)( m_nextRun - otherInfo.m_nextRun );
+ if (diff == 0) {
+ if (this == other) {
+ // Same object, return 0.
+ return 0;
+ } else {
+ // NOT the same object, MUST return non-0 value.
+ return System.identityHashCode(this) -
System.identityHashCode(other);
+ }
+ }
+ return diff;
}
/**
@@ -821,20 +825,16 @@
{
if( m_logger.isDebugEnabled( ) )
{
- m_logger.debug( "Hand over Command " +
- m_command.toString( ) + " to pool \"" +
- m_pool.getName( ) + "\" with delay=" +
m_delay +
- " and interval=" + m_interval );
+ m_logger.debug( "Executing command " + m_command + " in pool
\"" +
+ m_pool.getName( ) + "\", schedule with
interval=" + m_interval );
}
synchronized( m_commandStack )
{
m_commandStack.remove( this );
- m_nextRun = ( ( m_interval > 0 )
- ? ( System.currentTimeMillis( ) + m_interval )
: 0 );
-
- if( m_nextRun > 0 )
+ if( m_interval > 0 )
{
+ m_nextRun = System.currentTimeMillis( ) + m_interval;
m_commandStack.add( this );
}
}
@@ -847,12 +847,12 @@
{
if( m_logger.isDebugEnabled( ) )
{
- m_logger.debug( m_command + " has been interrupted" );
+ m_logger.debug( "Interrupted executing command + " +
m_command );
}
}
catch( final Throwable t )
{
- m_logger.error( "Exception thrown by Command " + m_command, t
);
+ m_logger.error( "Exception executing command " + m_command, t
);
}
}
}
Modified:
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultRunnableManagerTestCase.java
URL:
http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultRunnableManagerTestCase.java?view=diff&r1=155224&r2=155225
==============================================================================
---
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultRunnableManagerTestCase.java
(original)
+++
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultRunnableManagerTestCase.java
Thu Feb 24 11:05:25 2005
@@ -20,15 +20,13 @@
import org.apache.avalon.framework.logger.Logger;
import org.easymock.MockControl;
-
/**
* The $classType$ class ...
*
* @author <a href="mailto:giacomo.at.apache.org">Giacomo Pati </a>
* @version $Id$
*/
-public class DefaultRunnableManagerTestCase
- extends AbstractTestCase
+public class DefaultRunnableManagerTestCase extends AbstractTestCase
{
//~ Constructors
-----------------------------------------------------------
@@ -50,7 +48,7 @@
* @throws Exception DOCUMENT ME!
*/
public final void testConfigureDaemonPool( )
- throws Exception
+ throws Exception
{
final MockControl threadPoolConfigControl =
createStrictControl( Configuration.class );
@@ -506,15 +504,15 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"default\" created with maximum
queue-size=2147483647,max-pool-size=5,min-pool-size=5,priority=5,isDaemon=false,keep-alive-time-ms=60000,block-policy=\"RUN\",shutdown-wait-time-ms=-1"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "starting heart" );
+ logger.debug( "Starting the heart" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Entering loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable,pool=default,delay=0,interval=0" );
+ logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable, pool=default, delay=0, interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Hand over Command EasyMock for interface
java.lang.Runnable to pool \"default\" with delay=0 and interval=0" );
+ logger.debug( "Executing command EasyMock for interface
java.lang.Runnable in pool \"default\", schedule with interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -603,15 +601,15 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"default\" created with maximum
queue-size=2147483647,max-pool-size=5,min-pool-size=5,priority=5,isDaemon=false,keep-alive-time-ms=60000,block-policy=\"RUN\",shutdown-wait-time-ms=-1"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "starting heart" );
+ logger.debug( "Starting the heart" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Entering loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable,pool=default,delay=100,interval=0" );
+ logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable, pool=default, delay=100, interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Hand over Command EasyMock for interface
java.lang.Runnable to pool \"default\" with delay=100 and interval=0" );
+ logger.debug( "Executing command EasyMock for interface
java.lang.Runnable in pool \"default\", schedule with interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -700,15 +698,15 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"default\" created with maximum
queue-size=2147483647,max-pool-size=5,min-pool-size=5,priority=5,isDaemon=false,keep-alive-time-ms=60000,block-policy=\"RUN\",shutdown-wait-time-ms=-1"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "starting heart" );
+ logger.debug( "Starting the heart" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Entering loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable,pool=default,delay=100,interval=100" );
+ logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable, pool=default, delay=100, interval=100" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Hand over Command EasyMock for interface
java.lang.Runnable to pool \"default\" with delay=100 and interval=100" );
+ logger.debug( "Executing command EasyMock for interface
java.lang.Runnable in pool \"default\", schedule with interval=100" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Exiting loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -805,7 +803,7 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"default\" created with maximum
queue-size=2147483647,max-pool-size=5,min-pool-size=5,priority=5,isDaemon=false,keep-alive-time-ms=60000,block-policy=\"RUN\",shutdown-wait-time-ms=-1"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "starting heart" );
+ logger.debug( "Starting the heart" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Entering loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -815,9 +813,9 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"mypool\" created with maximum
queue-size=230,max-pool-size=15,min-pool-size=12,priority=1,isDaemon=false,keep-alive-time-ms=15500,block-policy=\"DISCARD\",shutdown-wait-time-ms=22200"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable,pool=mypool,delay=0,interval=0" );
+ logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable, pool=mypool, delay=0, interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Hand over Command EasyMock for interface
java.lang.Runnable to pool \"mypool\" with delay=0 and interval=0" );
+ logger.debug( "Executing command EasyMock for interface
java.lang.Runnable in pool \"mypool\", schedule with interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -922,7 +920,7 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"default\" created with maximum
queue-size=2147483647,max-pool-size=5,min-pool-size=5,priority=5,isDaemon=false,keep-alive-time-ms=60000,block-policy=\"RUN\",shutdown-wait-time-ms=-1"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "starting heart" );
+ logger.debug( "Starting the heart" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Entering loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -932,9 +930,9 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"mypool\" created with maximum
queue-size=230,max-pool-size=15,min-pool-size=12,priority=1,isDaemon=false,keep-alive-time-ms=15500,block-policy=\"DISCARD\",shutdown-wait-time-ms=22200"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable,pool=mypool,delay=100,interval=0" );
+ logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable, pool=mypool, delay=100, interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Hand over Command EasyMock for interface
java.lang.Runnable to pool \"mypool\" with delay=100 and interval=0" );
+ logger.debug( "Executing command EasyMock for interface
java.lang.Runnable in pool \"mypool\", schedule with interval=0" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "No commands available. Will just wait for one" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -1039,7 +1037,7 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"default\" created with maximum
queue-size=2147483647,max-pool-size=5,min-pool-size=5,priority=5,isDaemon=false,keep-alive-time-ms=60000,block-policy=\"RUN\",shutdown-wait-time-ms=-1"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "starting heart" );
+ logger.debug( "Starting the heart" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Entering loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
@@ -1049,9 +1047,9 @@
loggerControl.expectAndReturn( logger.isInfoEnabled( ), true );
logger.info( "ThreadPool named \"mypool\" created with maximum
queue-size=230,max-pool-size=15,min-pool-size=12,priority=1,isDaemon=false,keep-alive-time-ms=15500,block-policy=\"DISCARD\",shutdown-wait-time-ms=22200"
);
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable,pool=mypool,delay=100,interval=100" );
+ logger.debug( "Command entered: EasyMock for interface
java.lang.Runnable, pool=mypool, delay=100, interval=100" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
- logger.debug( "Hand over Command EasyMock for interface
java.lang.Runnable to pool \"mypool\" with delay=100 and interval=100" );
+ logger.debug( "Executing command EasyMock for interface
java.lang.Runnable in pool \"mypool\", schedule with interval=100" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
logger.debug( "Exiting loop" );
loggerControl.expectAndReturn( logger.isDebugEnabled( ), true );
Modified:
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadFactoryTestCase.java
URL:
http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadFactoryTestCase.java?view=diff&r1=155224&r2=155225
==============================================================================
---
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadFactoryTestCase.java
(original)
+++
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadFactoryTestCase.java
Thu Feb 24 11:05:25 2005
@@ -24,8 +24,7 @@
* @author <a href="mailto:giacomo.at.apache.org">Giacomo Pati</a>
* @version $Id$
*/
-public class DefaultThreadFactoryTestCase
- extends TestCase
+public class DefaultThreadFactoryTestCase extends TestCase
{
//~ Methods
----------------------------------------------------------------
@@ -100,8 +99,7 @@
* @author <a href="mailto:giacomo.at.apache.org">Giacomo Pati</a>
* @version $Id$
*/
- private static class DummyRunnable
- implements Runnable
+ private static class DummyRunnable implements Runnable
{
//~ Methods
------------------------------------------------------------
Modified:
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadPoolTestCase.java
URL:
http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadPoolTestCase.java?view=diff&r1=155224&r2=155225
==============================================================================
---
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadPoolTestCase.java
(original)
+++
cocoon/branches/BRANCH_2_1_X/src/test/org/apache/cocoon/components/thread/DefaultThreadPoolTestCase.java
Thu Feb 24 11:05:25 2005
@@ -18,15 +18,13 @@
import org.apache.avalon.framework.logger.ConsoleLogger;
import org.easymock.MockControl;
-
/**
* The $classType$ class ...
*
* @author <a href="mailto:giacomo.at.apache.org">Giacomo Pati</a>
* @version $Id$
*/
-public class DefaultThreadPoolTestCase
- extends AbstractTestCase
+public class DefaultThreadPoolTestCase extends AbstractTestCase
{
//~ Methods
----------------------------------------------------------------
@@ -38,10 +36,11 @@
final DefaultThreadPool pool = new DefaultThreadPool( );
pool.enableLogging( new ConsoleLogger( ConsoleLogger.LEVEL_DEBUG ) );
pool.setName( "mypool" );
- // We cannot mock the DefaultThreadFactory as the underlying
- // PooledExecutor of the DefaultThreadPool will again wrapp it into a
+
+ // We cannot mock the DefaultThreadFactory as the underlying
+ // PooledExecutor of the DefaultThreadPool will again wrapp it into a
// PooledExecutor.Worker instance that does some bookeeping.
- // Using a easymocked DefaultThreadFactory will prevent the
+ // Using a easymocked DefaultThreadFactory will prevent the
// PooledExecutor from shutting down and thus hangs forever.
final ThreadFactory threadFactory = new DefaultThreadFactory();
threadFactory.setPriority( Thread.MAX_PRIORITY );
@@ -53,6 +52,7 @@
pool.setBlockPolicy( "ABORT" );
pool.setShutdownGraceful( false );
pool.setShutdownWaitTimeMs( 12345 );
+
assertEquals( "block-policy", "ABORT", pool.getBlockPolicy( ) );
assertEquals( "keep-alive-time-ms", 11000L, pool.getKeepAliveTime( )
);
assertEquals( "max-queueu-size", 230, pool.getMaximumQueueSize( ) );
@@ -82,10 +82,10 @@
final DefaultThreadPool pool = new DefaultThreadPool( );
pool.enableLogging( new ConsoleLogger( ConsoleLogger.LEVEL_DEBUG ) );
pool.setName( "mypool" );
- // We cannot mock the DefaultThreadFactory as the underlying
- // PooledExecutor of the DefaultThreadPool will again wrapp it into a
+ // We cannot mock the DefaultThreadFactory as the underlying
+ // PooledExecutor of the DefaultThreadPool will again wrapp it into a
// PooledExecutor.Worker instance that does some bookeeping.
- // Using a easymocked DefaultThreadFactory will prevent the
+ // Using a easymocked DefaultThreadFactory will prevent the
// PooledExecutor from shutting down and thus hangs forever.
pool.setThreadFactory( new DefaultThreadFactory() );
pool.setQueue( 230 );
@@ -108,7 +108,7 @@
* @throws InterruptedException DOCUMENT ME!
*/
public final void testShutdown( )
- throws InterruptedException
+ throws InterruptedException
{
final Runnable runnable = new Runnable(){
public void run()
Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL:
http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/status.xml?view=diff&r1=155224&r2=155225
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Thu Feb 24 11:05:25 2005
@@ -202,6 +202,9 @@
<changes>
<release version="@version@" date="@date@">
+ <action dev="VG" type="fix">
+ Runnable Manager: Fix bug preventing scheduling of two different jobs at
the same time.
+ </action>
<action dev="SW" type="add">
Many changes in CForms block.
<br/>