package code.google.nfs.rpc.benchmark;
/**
* nfs-rpc
* Apache License
*
* http://code.google.com/p/nfs-rpc (c) 2011
*/
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import code.google.nfs.rpc.NamedThreadFactory;
import code.google.nfs.rpc.protocol.PBDecoder;
import code.google.nfs.rpc.protocol.RPCProtocol;
import code.google.nfs.rpc.protocol.SimpleProcessorProtocol;
import code.google.nfs.rpc.server.Server;
import code.google.nfs.rpc.server.ServerProcessor;
import com.esotericsoftware.kryo.serializers.DefaultArraySerializers;
import com.google.protobuf.ByteString;
/**
* Abstract benchmark server
*
* Usage: BenchmarkServer listenPort maxThreads responseSize
*
* @author <a href="mailto:bluedavy@gmail.com">bluedavy</a>
*/
public abstract class AbstractBenchmarkServer {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
public void run(String[] args) throws Exception {
if (args == null || args.length != 3) {
throw new IllegalArgumentException(
"must give three args: listenPort | maxThreads | responseSize");
}
int listenPort = Integer.parseInt(args[0]);
int maxThreads = Integer.parseInt(args[1]);
final int responseSize = Integer.parseInt(args[2]);
System.out.println(dateFormat.format(new Date())
+ " ready to start server,listenPort is: " + listenPort
+ ",maxThreads is:" + maxThreads + ",responseSize is:"
+ responseSize + " bytes");
Server server = getServer();
server.registerProcessor(SimpleProcessorProtocol.TYPE,RequestObject.class.getName(), new ServerProcessor() {
public Object handle(Object request) throws Exception {
return new ResponseObject(responseSize);
}
});
// for pb codec
PBDecoder.addMessage(PB.RequestObject.class.getName(), PB.RequestObject.getDefaultInstance());
PBDecoder.addMessage(PB.ResponseObject.class.getName(), PB.ResponseObject.getDefaultInstance());
server.registerProcessor(SimpleProcessorProtocol.TYPE,PB.RequestObject.class.getName(), new ServerProcessor() {
public Object handle(Object request) throws Exception {
PB.ResponseObject.Builder builder = PB.ResponseObject.newBuilder();
builder.setBytesObject(ByteString.copyFrom(new byte[responseSize]));
return builder.build();
}
});
server.registerProcessor(RPCProtocol.TYPE, "testservice", new BenchmarkTestServiceImpl(responseSize));
server.registerProcessor(RPCProtocol.TYPE, "testservicepb", new PBBenchmarkTestServiceImpl(responseSize));
KryoUtils.registerClass(byte[].class, new DefaultArraySerializers.ByteArraySerializer(), 0);
KryoUtils.registerClass(RequestObject.class, new RequestObjectSerializer(), 1);
KryoUtils.registerClass(ResponseObject.class, new ResponseObjectSerializer(), 2);
ThreadFactory tf = new NamedThreadFactory("BUSINESSTHREADPOOL");
ExecutorService threadPool = new ThreadPoolExecutor(20, maxThreads,
300, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), tf);
server.start(listenPort, threadPool);
}
/**
* Get server instance
*/
public abstract Server getServer();
}