package org.jboss.pitbull.stress;
import org.jboss.pitbull.Connection;
import org.jboss.pitbull.server.HttpServer;
import org.jboss.pitbull.server.HttpServerBuilder;
import org.jboss.pitbull.RequestHeader;
import org.jboss.pitbull.StatusCode;
import org.jboss.pitbull.server.handlers.stream.StreamRequestHandler;
import org.jboss.pitbull.server.handlers.stream.StreamedResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class StressService implements StreamRequestHandler
{
public static byte[] readFromStream(int bufferSize, InputStream entityStream)
throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[bufferSize];
int wasRead = 0;
do
{
wasRead = entityStream.read(buffer);
if (wasRead > 0)
{
baos.write(buffer, 0, wasRead);
}
} while (wasRead > -1);
return baos.toByteArray();
}
public static AtomicLong success = new AtomicLong(0);
public static AtomicLong hits = new AtomicLong(0);
public static Object lock = new Object();
@Override
public void execute(Connection connection, RequestHeader requestHeader, InputStream requestBody, StreamedResponse response) throws IOException
{
hits.incrementAndGet();
if (requestHeader.getMethod().equalsIgnoreCase("GET")) doGet(connection, requestHeader, response);
else if (requestHeader.getMethod().equalsIgnoreCase("PUT"))
doPut(connection, requestHeader, requestBody, response);
else if (requestHeader.getMethod().equalsIgnoreCase("POST"))
doPost(connection, requestHeader, requestBody, response);
else throw new RuntimeException("Unkown Method");
success.incrementAndGet();
}
public void doGet(Connection connection, RequestHeader requestHeader, StreamedResponse response) throws IOException
{
response.setStatus(StatusCode.OK);
response.getHeaders().addHeader("Content-Type", "text/plain");
response.getOutputStream().write("DO GET".getBytes());
}
public void doPut(Connection connection, RequestHeader requestHeader, InputStream requestBody, StreamedResponse response) throws IOException
{
response.setStatus(StatusCode.NO_CONTENT);
}
public void doPost(Connection connection, RequestHeader requestHeader, InputStream requestBody, StreamedResponse response) throws IOException
{
response.setStatus(StatusCode.OK);
response.getHeaders().addHeader("Content-Type", "text/plain");
byte[] bytes = readFromStream(1024, requestBody);
response.getOutputStream().write(bytes);
}
public static void main(String[] args) throws Exception
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run()
{
System.out.println();
System.out.println("-- Server shutdown --");
System.out.println("Total hits: " + hits.longValue());
System.out.println("Total success: " + success.longValue());
}
});
int workers = 4;
int requestThreads = 100;
if (args.length >= 1)
{
try
{
int tmp = Integer.parseInt(args[0]);
if (tmp < 1)
{
System.out.println("Can't have less than 1 worker");
return;
}
workers = tmp;
}
catch (NumberFormatException e)
{
}
}
if (args.length >= 2)
{
try
{
int tmp = Integer.parseInt(args[1]);
if (tmp < 1)
{
System.out.println("Can't have less than 1 requestThread");
return;
}
requestThreads = tmp;
}
catch (NumberFormatException e)
{
}
}
start(workers, requestThreads);
synchronized (lock)
{ lock.wait(); }
}
public static HttpServer start(int workers, int requestThreads) throws Exception
{
HttpServer http = new HttpServerBuilder().connector().add()
.workers(workers)
.maxRequestThreads(requestThreads).build();
http.start();
http.register("/{.*}", new StressService());
return http;
}
}