/*********************************************************************
* AdapterSpeedLog.java
* created on 29.07.2006 by netseeker
* $Id: AdapterSpeedLog.java,v 1.10 2007/05/28 12:42:37 netseeker Exp $
* $Log: AdapterSpeedLog.java,v $
* Revision 1.10 2007/05/28 12:42:37 netseeker
* *** empty log message ***
*
* Revision 1.9 2007/05/27 22:13:09 netseeker
* *** empty log message ***
*
* Revision 1.8 2007/03/22 21:01:34 netseeker
* *** empty log message ***
*
* Revision 1.7 2007/02/11 15:42:29 netseeker
* *** empty log message ***
*
* Revision 1.6 2006/11/05 16:59:50 netseeker
* *** empty log message ***
*
* Revision 1.5 2006/10/11 22:40:32 netseeker
* *** empty log message ***
*
* Revision 1.4 2006/08/15 16:48:42 netseeker
* *** empty log message ***
*
* Revision 1.3 2006/08/09 20:13:54 netseeker
* *** empty log message ***
*
* Revision 1.2 2006/08/02 23:03:34 netseeker
* *** empty log message ***
*
* Revision 1.1 2006/07/31 22:29:50 netseeker
* *** empty log message ***
*
*
* ====================================================================
*
* Copyright 2005-2006 netseeker aka Michael Manske
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*
* This file is part of the EJOE framework.
* For more information on the author, please see
* <http://www.manskes.de/>.
*
*********************************************************************/
package de.netseeker.ejoe.test;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPOutputStream;
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.CastorAdapter;
import de.netseeker.ejoe.adapter.HessianAdapter;
import de.netseeker.ejoe.adapter.JavaBeansXmlAdapter;
import de.netseeker.ejoe.adapter.JavolutionAdapter;
import de.netseeker.ejoe.adapter.ObjectStreamAdapter;
import de.netseeker.ejoe.adapter.SerializeAdapter;
import de.netseeker.ejoe.adapter.SkaringaAdapter;
import de.netseeker.ejoe.adapter.SojoAdapter;
import de.netseeker.ejoe.adapter.XStreamAdapter;
import de.netseeker.ejoe.adapter.json.JsonToolsAdapter;
/**
* @author netseeker
* @since 0.3.9.1
*/
public class AdapterSpeedLog
{
private static SerializeAdapter[] adapters = new SerializeAdapter[] { new JavaBeansXmlAdapter(),
new ObjectStreamAdapter(), new XStreamAdapter(), new HessianAdapter(), new JavolutionAdapter(),
new JsonToolsAdapter(), createCastorAdapter(), new SojoAdapter(), new SkaringaAdapter() };
private static CastorAdapter createCastorAdapter()
{
try
{
return new CastorAdapter( AdapterSpeedLog.class.getResource( "castor-mapping.xml" ) );
}
catch ( Exception e )
{
e.printStackTrace();
}
return new CastorAdapter();
}
private static String dFormat = "yyyy-MM-dd HH:mm:ss.SSS";
/**
* @param args
*/
public static void main( String[] args )
{
int port = EJConstants.EJOE_PORT;
// register our custom Castor Adapter in the Server
AdapterFactory.registerAdapter( createCastorAdapter() );
String header = "Adapter;start time;end time;duration in ms;average single duration in ms; size of serialized object in bytes; errors";
int loops = 1000;
for ( int runs = 0; runs < 4; runs++ )
{
String fileName = "adapterReport";
fileName += runs < 2 ? "_NIO" : "_BIO";
fileName += (runs == 1 || runs == 3) ? "_GZIP" : "";
fileName += ".";
fileName += loops;
fileName += ".csv";
List results = new ArrayList();
EJServer server = new EJServer( new TestHandler(), port );
server.setMaxReadProcessors( 1 );
server.setMaxWriteProcessors( 1 );
server.enablePersistentConnections( true );
server.enableNonBlockingIO( runs < 2 );
server.enableCompression( runs == 1 || runs == 3 );
server.enablePersistentConnections( true );
try
{
System.out.println( "Starting EJServer..." );
server.start();
System.out.println( "Waiting 3 seconds..." );
Thread.sleep( 3000 );
System.out.println( "Running warmup for each adapter..." );
for ( int i = 0; i < adapters.length; i++ )
{
System.out.println( "Running warmup for " + adapters[i] );
EJClient client = new EJClient( "localhost", port, adapters[i] );
client.enablePersistentConnection( true );
client.enableCompression( runs == 1 || runs == 3 );
client.setInJVM( true );
try
{
for ( int t = 0; t < 5; t++ )
client.execute( new ObjectBean() );
}
finally
{
client.close();
}
}
}
catch ( Exception e1 )
{
e1.printStackTrace();
System.exit( -1 );
}
System.out.println( "Waiting 3 seconds..." );
try
{
Thread.sleep( 3000 );
}
catch ( InterruptedException e1 )
{
e1.printStackTrace();
System.exit( -1 );
}
Object result = null;
String[] msgs = new String[3];
for ( int i = 0; i < adapters.length; i++ )
{
EJClient client = new EJClient( "localhost", port, adapters[i] );
client.enablePersistentConnection( true );
client.enableCompression( runs == 1 || runs == 3 );
client.setInJVM( true );
System.out.println( "Running test on " + adapters[i] + " with target " + fileName );
Date start = new Date();
try
{
for ( int go = 0; go < loops; go++ )
{
try
{
result = client.execute( new ObjectBean() );
}
catch ( Throwable e )
{
msgs[2] = "Exception occured while processing the request!" + e + ':' + e.getMessage();
go = runs;
break;
}
}
}
finally
{
client.close();
}
Date end = new Date();
long duration = end.getTime() - start.getTime();
DateFormat df = new SimpleDateFormat( dFormat );
BigDecimal resultF = BigDecimal.valueOf( (duration * 1.00) / (loops * 1.00) )
.setScale( 2, BigDecimal.ROUND_HALF_UP );
DecimalFormat dcf = new DecimalFormat( "###.##" );
msgs[0] = adapters[i].getClass().getName() + ';' + df.format( start ) + ';' + df.format( end ) + ';'
+ duration + ";" + dcf.format( resultF );
msgs[1] = "-1";
if ( result == null || !(result instanceof ObjectBean)
|| !((ObjectBean) result).getTheString().equals( "Accepted" ) )
{
msgs[2] = "Errors during (de)serialization! Server returned: "
+ (result != null ? (result.getClass().getName() + ':' + result) : "null");
}
else
{
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
SerializeAdapter adpt = adapters[i];
try
{
if ( runs == 1 || runs == 3 )
{
DeflaterOutputStream sOut = new GZIPOutputStream( bOut, EJConstants.BUFFERED_STREAM_SIZE )
{
{
def.setLevel( EJConstants.DEFAULT_COMPRESSION_LEVEL );
}
};
adpt.write( new ObjectBean(), sOut );
sOut.finish();
sOut.close();
}
else
{
adpt.write( new ObjectBean(), bOut );
}
msgs[1] = String.valueOf( bOut.size() );
}
catch ( Exception e )
{
e.printStackTrace();
}
}
results.add( msgs[0] + ';' + msgs[1] + ";" + (msgs[2] != null ? msgs[2] : "") );
msgs[0] = null;
msgs[1] = null;
msgs[2] = null;
}
try
{
System.out.println( "Creating file " + fileName );
BufferedWriter out = new BufferedWriter( new FileWriter( fileName ) );
out.write( header );
out.write( "\r\n" );
for ( Iterator it = results.iterator(); it.hasNext(); )
{
out.write( (String) it.next() );
out.write( "\r\n" );
}
out.close();
}
catch ( IOException e )
{
e.printStackTrace();
}
System.out.println( "Stopping server..." );
server.stop();
port++;
if ( runs < 3 )
{
try
{
System.out.println( "Waiting for 5s before starting the next test..." );
Thread.sleep( 5000 );
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
}
}
System.exit( 0 );
}
}