package com.neverwinterdp.demandspike; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.QueryStringDecoder; import java.util.Map; import java.util.Random; import com.neverwinterdp.netty.http.HttpServer; import com.neverwinterdp.netty.http.RouteHandlerGeneric; import com.neverwinterdp.util.JSONSerializer; public class HttpServerSimulator { HttpServer server; HttpServerSimulator.MessageHandler handler ; public HttpServerSimulator(int numOfWorkers, int minProcessTime, int maxProcessTime) { server = new HttpServer(); handler = new MessageHandler(); server.add("/message", handler); server.setPort(7080); server.setNumberOfWorkers(numOfWorkers); handler.setMinProcessTime(minProcessTime); handler.setMaxProcessTime(maxProcessTime); } public HttpServerSimulator start() { server.startAsDeamon(); return this ; } public HttpServerSimulator shutdown() { server.shutdown(); return this ; } static public byte[] newPayload(String key, Map<String, String> params, byte[] data) { Payload payload = new Payload(key, params, data) ; return JSONSerializer.INSTANCE.toBytes(payload) ; } static public class Payload { private String key; private Map<String, String> params ; private byte[] data ; public Payload() {} public Payload(String key, Map<String, String> params, byte[] data) { this.key = key ; this.params = params ; this.data = data ; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Map<String, String> getParams() { return params; } public void setParams(Map<String, String> params) { this.params = params; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } } static public class MessageHandler extends RouteHandlerGeneric { int postCount = 0; int getCount = 0; int minProcessTime = 0 ; int maxProcessTime = 0 ; Random random = new Random() ; public void setMinProcessTime(int min) { this.minProcessTime = min ; if(maxProcessTime < minProcessTime) maxProcessTime = minProcessTime ; } public void setMaxProcessTime(int max) { this.maxProcessTime = max ; if(minProcessTime > maxProcessTime) minProcessTime = maxProcessTime ; } @Override protected void doPost(ChannelHandlerContext ctx, HttpRequest httpReq) { postCount++; processTime() ; FullHttpRequest req = (FullHttpRequest) httpReq ; ByteBuf byteBuf = req.content() ; byte[] data = new byte[byteBuf.readableBytes()] ; byteBuf.readBytes(data) ; byteBuf.release() ; Payload payload = JSONSerializer.INSTANCE.fromBytes(data, Payload.class) ; writeJSON(ctx, httpReq, payload) ; } @Override protected void doGet(ChannelHandlerContext ctx, HttpRequest httpReq) { getCount++; processTime() ; QueryStringDecoder reqDecoder = new QueryStringDecoder(httpReq.getUri()) ; String data = reqDecoder.parameters().get("data").get(0) ; Payload payload = JSONSerializer.INSTANCE.fromString(data, Payload.class) ; writeJSON(ctx, httpReq, payload) ; this.writeContent(ctx, httpReq, "do get", "text/plain"); } private void processTime() { try { int processTime = minProcessTime + random.nextInt(maxProcessTime - minProcessTime) ; //Simulate the process time to return the response between minProcessTime - maxProcessTime Thread.sleep(random.nextInt(processTime)); } catch (InterruptedException e) { e.printStackTrace(); } } } }