bloritsch 2002/09/27 13:27:16
Modified: event/src/xdocs menu.xml
Added: event/src/xdocs command-howto.xml
Log:
Add documentation for CommandManager
Revision Changes Path
1.9 +2 -0 jakarta-avalon-excalibur/event/src/xdocs/menu.xml
Index: menu.xml
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/event/src/xdocs/menu.xml,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- menu.xml 26 Sep 2002 18:34:12 -0000 1.8
+++ menu.xml 27 Sep 2002 20:27:16 -0000 1.9
@@ -21,7 +21,9 @@
<menu name="How To">
<!--
<item href="event-howto.html" name="Use Event Queues"/>
+-->
<item href="command-howto.html" name="Use the Command Manager"/>
+<!--
<item href="mpool-howto.html" name="Use MPool"/>
<item href="thread-howto.html" name="Use Thread Pools"/>
-->
1.1
jakarta-avalon-excalibur/event/src/xdocs/command-howto.xml
Index: command-howto.xml
===================================================================
<?xml version="1.0"?>
<document>
<header>
<title>Excalibur Event - How To Use Command</title>
<authors>
<person name="Berin Loritsch" email="[EMAIL PROTECTED]"/>
</authors>
</header>
<body>
<s1 title="Setting Up The Command Manager">
<p>
Using Command is a two step process. You have to set it up,
and then you can send Commands to it. Because Command uses
an Event Pipeline to move the Commands through the Queue to
the EventHandler, we need to set up a ThreadManager. Currently
the only ThreadManager that works as advertized is the
TPCThreadManager.
TPC stands for "Thread Per CPU". The TPCThreadManager allows
you to customize its behaviour by passing in some parameters.
The code snippet below is fairly typical:
</p>
<source>
<![CDATA[
ThreadManager threadManager = new TPCThreadManager();
threadManager.enableLogging( getLogger().getChildLogger("threadmanager") );
Parameters params = new Parameters();
params.setParameter( "threads-per-processor", "2" );
params.setParameter( "sleep-time", "1000" );
params.setParameter( "block-timeout", "250" );
threadManager.parameterize( params );
threadManager.initialize();
]]>
</source>
<p>
We create a Threadmanager, pass in the Logger, pass in the Parameters,
and then initialize it. The table below provides all the parameter
names
that TPCThreadManager recognizes:
</p>
<table>
<tr>
<th>Name</th> <th>Description</th> <th>Default Value</th>
</tr>
<tr>
<td>processors</td>
<td>Number of processors (autodetected if less than one)</td>
<td>Results from SystemUtil.numProcessors()</td>
</tr>
<tr>
<td>threads-per-processor</td>
<td>Threads per processor to use (Rewritten to 1 if less than
one)</td>
<td>1</td>
</tr>
<tr>
<td>sleep-time</td>
<td>Time (in milliseconds) to wait between queue pipeline
processing runs</td>
<td>1000</td>
</tr>
<tr>
<td>block-timeout</td>
<td>Time (in milliseconds) to wait for a thread to process a
pipeline</td>
<td>1000</td>
</tr>
</table>
<p>
Once the ThreadManager is set up and used, we can set up the
CommandManager.
We do this by instantiating the CommandManager, and registering it
with the
ThreadManager. Below is a code snippet showing how that is done:
</p>
<source>
<![CDATA[
// Create the CommandManager
CommandManager commandManager = new CommandManager();
// Register it with the ThreadManager
threadManager.register( commandManager );
]]>
</source>
</s1>
<s1 title="Running Commands">
<p>
There are three Command interfaces: Command, DelayedCommand, and
RepeatedCommand.
Each one of those has a special purpose. The Command interface
exposes the method
that the CommandManager will execute named, oddly enough,
"execute()". The
Delayed Command is used to specify a number of milliseconds to wait
before the
command is run. That delay is based on when the CommandManager
receives the
DelayedCommand, not on when the object was created. Lastly the
RepeatedCommand
interface is used to determine how long and how many times the
Command will
be executed. Below is a code snippet showing how to send Commands to
the
CommandManager:
</p>
<source>
<![CDATA[
Sink commandSink = commandManager.getCommandSink();
commandSink.enqueu( new MySpecialCommand() );
]]>
</source>
<p>
It's not that hard to use the CommandManager. Writing a Command is
as easy as
implementing the java.lang.Runnable interface. There are two
distinct advantages
to using the Command infrastructure: your Command can throw
exceptions and it
won't cause anything to break, and you have the ability to
automatically have
your Command run again. Just keep in mind that the Command
infrastructure was
meant for short lived management functions happening in the
background, not
a long lived thread. If you want to give the illusion that your
Command is
running a long time without tying up system resources the whole time,
then
write a RepeatedCommand. Below is an example RepeatedCommand that is
used
for the DefaultPoolManager in MPool:
</p>
<source>
<![CDATA[
/**
* This is run every 10 seconds, starting after a 10 second delay.
* It gives the appearance of being a long running thread, but it
* does not consume a Thread for the times it would otherwise be
* asleep.
*/
private static final class PoolManagerCommand
implements RepeatedCommand
{
private final BucketMap m_map;
private final int m_min = 4;
private final int m_max = 256;
private final int m_grow = 4;
protected PoolManagerCommand( BucketMap map )
{
m_map = map;
}
public long getDelayInterval()
{
return 10 * 1000L;
}
public long getRepeatInterval()
{
return 10 * 1000L;
}
public int getNumberOfRepeats()
{
return 0;
}
public void execute()
throws Exception
{
Iterator i = m_map.keySet().iterator();
while( i.hasNext() )
{
ManagablePool pool = (ManagablePool)i.next();
long key = ( (Long)m_map.get( pool ) ).longValue();
int size = pool.size( key );
if( size < m_min )
{
pool.grow( m_grow, key );
}
if( size > m_max )
{
pool.shrink( m_grow, key );
}
}
}
}
]]>
</source>
</s1>
</body>
<footer>
<legal>
Copyright (c) @year@ The Jakarta Apache Project All rights reserved.
$Revision: 1.1 $ $Date: 2002/09/27 20:27:16 $
</legal>
</footer>
</document>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>