我是靠谱客的博主 悦耳麦片,最近开发中收集的这篇文章主要介绍使用多线程模拟多用户并发访问一个或多个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");

}
}

最后

以上就是悦耳麦片为你收集整理的使用多线程模拟多用户并发访问一个或多个tomcat,测试性能的全部内容,希望文章能够帮你解决使用多线程模拟多用户并发访问一个或多个tomcat,测试性能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部