/*********************************************************************
* MassiveRemoteTest.java
* created on 15.08.2004 by netseeker
* $Source: /cvsroot/ejoe/EJOE/test/de/netseeker/ejoe/test/MassiveObjectStreamTest.java,v $
* $Date: 2007/05/28 12:42:37 $
* $Revision: 1.41 $
*********************************************************************/
package de.netseeker.ejoe.test;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import junit.framework.TestCase;
import de.netseeker.ejoe.EJClient;
import de.netseeker.ejoe.EJConstants;
import de.netseeker.ejoe.EJServer;
import de.netseeker.ejoe.adapter.AdapterFactory;
import de.netseeker.ejoe.adapter.SerializeAdapter;
import de.netseeker.ejoe.adapter.XStreamAdapter;
import de.netseeker.ejoe.handler.ServerHandler;
/**
* @author netseeker aka Michael Manske
*/
public class MassiveObjectStreamTest extends TestCase
{
private Logger log = Logger.getLogger( getClass().getName() );
EJServer server;
EJClient client;
int threads = 8, readers = 4, writers = 2;
private int port = EJConstants.EJOE_PORT;
AtomicInteger successCount = new AtomicInteger( 0 );
AtomicInteger activeCount;
boolean compression;
boolean blocking;
boolean persistent;
boolean useSingleClient = false;
boolean useCustomTypes = true;
boolean inJvm = false;
ServerHandler handler = new TestHandler();
SerializeAdapter adapter = new XStreamAdapter( true );
// SerializeAdapter adapter = new JavolutionAdapter();
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception
{
super.setUp();
BaseTest.stopAllServers();
if ( getClass().equals( MassiveObjectStreamTest.class ) )
{
if ( useSingleClient ) persistent = true;
handler = new TestHandler();
inJvm = false;
compression = false;
blocking = false;
}
port = BaseTest.randomizer.nextInt( 20000 );
if ( port < 5000 ) port += 5000;
AdapterFactory.registerAdapter( adapter );
server = new EJServer( handler, port );
System.out.println( "using handler" + handler.getClass().getName() );
if ( compression ) server.enableCompression( true );
if ( !blocking ) server.enableNonBlockingIO( true );
if ( inJvm )
{
readers = 1;
writers = 1;
}
server.setMaxReadProcessors( readers );
server.setMaxWriteProcessors( writers );
server.enablePersistentConnections( persistent );
server.start();
activeCount = new AtomicInteger( threads );
if ( useSingleClient )
{
client = new EJClient( "127.0.0.1", port, adapter );
client.enableCompression( compression );
client.enablePersistentConnection( persistent );
if ( inJvm ) client.setInJVM( true );
}
Thread.sleep( 1000 );
}
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception
{
server.stop();
Thread.sleep( 1000 );
handler = new TestHandler();
compression = false;
blocking = false;
persistent = false;
useSingleClient = false;
useCustomTypes = true;
inJvm = false;
AdapterFactory.clear();
super.tearDown();
}
public void testExecute()
{
log.log( Level.INFO, "Starting " + threads + " client threads..." );
for ( int i = 1; i <= threads; i++ )
{
new ClientThread( adapter, i ).start();
}
long start = System.currentTimeMillis();
while ( activeCount.get() > 0 )
{
log.log( Level.INFO, "active threads: " + activeCount );
try
{
Thread.sleep( 50 );
}
catch ( InterruptedException e )
{
// do nothing
}
}
if ( useSingleClient ) client.close();
log.log( Level.INFO, successCount + " clients returned successfully..." );
System.out.println( "Clients processing time " + (System.currentTimeMillis() - start) + " ms." );
assertEquals( threads, successCount.get() );
}
class ClientThread extends Thread
{
private int number;
private SerializeAdapter adapter;
public ClientThread(SerializeAdapter adapter, int number)
{
super( "EJOE Clientthread: " + number );
this.number = number;
this.adapter = adapter;
}
public void run()
{
log.log( Level.INFO, System.currentTimeMillis() + " -- ClientThread" + number + " started" );
EJClient ejclient = null;
if ( !useSingleClient )
{
ejclient = new EJClient( "127.0.0.1", port, adapter );
ejclient.enableCompression( compression );
ejclient.enablePersistentConnection( persistent );
ejclient.setConnectionTimeout( 60000 );
if ( inJvm ) ejclient.setInJVM( true );
}
else
{
ejclient = client;
}
Map result = null;
Map input = new HashMap();
input.put( "KEY1", "Hello" );
input.put( "KEY2", Integer.valueOf( 101 ) );
input.put( "KEY3", BigDecimal.valueOf( 102 ) );
if ( useCustomTypes )
{
input.put( "KEY4", new ObjectBean() );
}
try
{
result = (Map) ejclient.execute( input );
assertNotNull( result );
if ( useCustomTypes )
{
assertNotNull( result.get( "KEY4" ) );
Object objBean = result.get( "KEY4" );
assertTrue( objBean instanceof ObjectBean );
}
log.log( Level.INFO, System.currentTimeMillis() + " -- ClientThread" + number + " return map contains "
+ result.size() + " entries." );
}
catch ( Exception e )
{
log.log( Level.SEVERE, "Test failed!", e );
}
finally
{
if ( result != null )
{
successCount.getAndIncrement();
}
activeCount.getAndDecrement();
if ( !useSingleClient ) ejclient.close();
}
log.log( Level.INFO, System.currentTimeMillis() + " -- ClientThread" + number + " finished" );
}
}
}