施用多线程模拟多用户并发访问一个或多个tomcat,测试性能

使用多线程模拟多用户并发访问一个或多个tomcat,测试性能
package test;

import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.CountDownLatch;

import org.apache.log4j.Logger;

public class CallHttpRequest implements Runnable {
	private static Logger log = Logger.getLogger(CallHttpRequest.class);
	public  static int successRequest = 0;
	public  static int failRequest = 0;
	public  static int timeOutRequest = 0;
	private final String hostString = "http://localhost:";
	private String port;
	private String puductPartURL;

	private CountDownLatch begin;
	private CountDownLatch end;

	CallHttpRequest(String port, String puductPartURL, CountDownLatch begin,
			CountDownLatch end) {
		this.port = port;
		this.puductPartURL = puductPartURL;
		this.begin = begin;
		this.end = end;
	}

	private String makeFullURL() {
		return hostString + port + puductPartURL;

	}
	private  static synchronized void incrementSuccessCount(){
		 successRequest++;
	}
	
	private  static synchronized void incrementFailCount(){
		 failRequest++;
	}
	
	private static synchronized void incrementTimeOutCount(){
		 timeOutRequest++;
	}
	
	@Override
	public void run() {
		String urlStr = makeFullURL();
		URL url;
		try {
			begin.await();
			url = new URL(urlStr);
			URLConnection URLconnection = url.openConnection();
			HttpURLConnection httpConnection = (HttpURLConnection) URLconnection;
			httpConnection.setConnectTimeout(3000);
			int responseCode = httpConnection.getResponseCode();
			if (responseCode == HttpURLConnection.HTTP_OK) {
				incrementSuccessCount();
			} else {
				incrementFailCount();
			}
		} catch (SocketTimeoutException e) {
			incrementTimeOutCount();
			log.error(e.getMessage(), e);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		} finally {
			end.countDown();
		}

	}

}


package test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

public class ParseUrl {
	private static Logger log = Logger.getLogger(ParseUrl.class);

	private static final String[] portArray = new String[] { "1111", "2222",
			"3333" };

	/*从文件中使用正则解析出url的部分信息,下面正则是将 以/开头的,非空白字符结尾的字符串取出,如“/abcc空格”字符串,\s为任意的空白符  */
	public static ArrayList<String> fetchUrlFromFile(String str) {
		ArrayList<String> arrayList = new ArrayList<String>();
		Pattern urlPattern = Pattern.compile("/[^\\s]+");
		//Pattern urlPattern = Pattern.compile("/[\\S]+");
		Matcher matcher = urlPattern.matcher(str);
		while (matcher.find()) {
			arrayList.add(matcher.group());
		}
		return arrayList;
	}

	public static void main(String[] args) throws Exception {
		CountDownLatch begin = new CountDownLatch(1);

		StringBuilder stringBuilder = new StringBuilder();
		String filePath = args[0];
		FileReader fr = new FileReader(filePath);
		BufferedReader br = new BufferedReader(fr);
		while (br.ready()) {
			stringBuilder.append(br.readLine());
		}
		String stringAll = stringBuilder.toString();
		ArrayList<String> arrayList = fetchUrlFromFile(stringAll);
		int allRequestSize = arrayList.size();
		log.info("all request size is " + allRequestSize);
		//设置最大的并发数量为60
		ExecutorService exec = Executors.newFixedThreadPool(60);

		CountDownLatch end = new CountDownLatch(allRequestSize);
//		int i = 0;
		for (String str : arrayList) {
			exec.execute(new CallHttpRequest(portArray[0], str, begin, end));
			
			/*如果想测试60个线程并发的访问,发配到同一台服务器上的两个tomcat,就用下面注释掉的代码
			 * if (i % 2 == 0) {
				exec.execute(new CallHttpRequest(portArray[0], str, begin, end));
			} else if (i % 2 == 1) {
				exec.execute(new CallHttpRequest(portArray[1], str, begin, end));
			} */
//			i++;
		}
		long startTime = System.currentTimeMillis();
		//当60个线程,初始化完成后,解锁,让六十个线程在4个双核的cpu服务器上一起竞争着跑,来模拟60个并发线程访问tomcat
		begin.countDown();

		try {
			end.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			log.info("all url requests is done!");
			log.info("the success size: " + CallHttpRequest.successRequest);
			log.info("the fail size: " + CallHttpRequest.failRequest);
			log.info("the timeout size: " + CallHttpRequest.timeOutRequest);
			double successRate = (double)CallHttpRequest.successRequest / allRequestSize;
			log.info("the success rate is: " + successRate*100+"%");
			long endTime = System.currentTimeMillis();
			long costTime = endTime - startTime;
			log.info("the total time cost is: " + costTime + " ms");
			log.info("every request time cost is: " + costTime / allRequestSize
					+ " ms");
		}
		exec.shutdown();
		log.info("main method end");

	}
}