package com.neverwinterdp.sparkngin.http; import static org.junit.Assert.assertEquals; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpResponse; import io.netty.util.CharsetUtil; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.neverwinterdp.message.Message; import com.neverwinterdp.netty.http.client.ResponseHandler; /** * @author Tuan Nguyen * @email tuan08@gmail.com */ public class MassConnectionSparknginHttpServerPerformanceTest { int NUM_OF_SERVER_THREAD = 5 ; int NUM_OF_CONCURRENT_WORKERS = 5 * NUM_OF_SERVER_THREAD ; int NUM_OF_WORKERS = 2 * NUM_OF_CONCURRENT_WORKERS ; int NUM_OF_MESSAGE_PER_WORKER = 1000 ; int EXPECT_MESSAGES_SENT = NUM_OF_WORKERS * NUM_OF_MESSAGE_PER_WORKER ; private SparknginServer server ; private AtomicLong messageCounter = new AtomicLong() ; @Before public void setup() throws Exception { server = new SparknginServer() ; } @After public void teardown() { server.shutdown() ; } @Test public void testMassConnection() throws Exception { //Thread.sleep(30000); //ExecutorService executor = Executors.newScheduledThreadPool(NUM_OF_CONCURRENT_WORKERS); ExecutorService executor = Executors.newFixedThreadPool(NUM_OF_CONCURRENT_WORKERS); long startTime = System.currentTimeMillis() ; for(int i = 0; i < NUM_OF_WORKERS; i++) { executor.submit(new MessageProducer(NUM_OF_MESSAGE_PER_WORKER)); } executor.shutdown() ; executor.awaitTermination(10, TimeUnit.MINUTES) ; long executeTime = System.currentTimeMillis() - startTime ; System.out.println("Expect sent: " + EXPECT_MESSAGES_SENT) ; System.out.println("Sent: " + messageCounter.get()); System.out.println("Forward: " + server.forwarder.getProcessCount()); System.out.println("Execute Time: " + executeTime + "ms"); System.out.println("Forward After 30s: " + server.forwarder.getProcessCount()); } public class MessageProducer implements Runnable { int numOfMessages ; public MessageProducer(int numOfMessages) { this.numOfMessages = numOfMessages ; } public void run() { JSONHttpSparknginClient client = null ; try { client = new JSONHttpSparknginClient ("127.0.0.1", server.server.getPort(), 100, true) ; byte[] data = new byte[1024] ; for(int i = 0; i < data.length; i++) { data[i] = (byte) (i % 255); } for(int i = 0; i < numOfMessages; i++) { Message message = new Message("m" + i, data, true) ; //The message has to be sent in 5s client.sendPost(message, 30000); messageCounter.incrementAndGet() ; } client.waitAndClose(5000); assertEquals(0, client.getErrorCount()) ; assertEquals(numOfMessages, client.getSendCount()) ; } catch(Throwable ex) { System.err.println("Message Producer Error!"); ex.printStackTrace(); if(client != null) client.close(); } } } static public class MessageResponseHandler implements ResponseHandler { int count = 0; int failure = 0; String expectMessage ; public MessageResponseHandler(String expectMessage) { this.expectMessage = expectMessage ; } public void onResponse(HttpResponse response) { count++; HttpContent content = (HttpContent) response; String message = content.content().toString(CharsetUtil.UTF_8); try{ assertEquals(expectMessage, message); } catch(AssertionError e){ failure++; } } public int getCount(){ return this.count; } public int getFailure(){ return this.failure; } } }