public class CommonWebRequestPressureTest implements WebRequestPressureTest {
//实现接口
@Override
public TestResult testRequest(String getRequestUrl, int concurrency, int requestNumber) {
//获取所有请求花费的时间
List<Long> intervals = request(getRequestUrl, concurrency, requestNumber);
//计算平均响应时间和95%的响应时间
return getTestResultWithRequestIntervals(intervals);
}
private List<Long> request(String getRequestUrl, int concurrency, int requestNumber) {
ExecutorService executorService = Executors.newFixedThreadPool(concurrency);
ConcurrentMap<Integer, Long> requestIntervalMap = new ConcurrentHashMap<>(requestNumber);
CountDownLatch startLatch = new CountDownLatch(1);
CountDownLatch endLatch = new CountDownLatch(requestNumber);
//添加请求
for (int i = 0; i < requestNumber; i++) {
executorService.submit(new RequestRunner(startLatch, endLatch, i, requestIntervalMap, getRequestUrl));
}
//开始请求
startLatch.countDown();
//等待所有请求完成
try {
endLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
//返回所有请求时间
return new ArrayList<>(requestIntervalMap.values());
}
private TestResult getTestResultWithRequestIntervals(List<Long> intervals) {
//从小到大排序,用于计算95%的响应时间
intervals.sort(Comparator.comparing(Long::longValue));
Long[] intervalsArray = intervals.toArray(new Long[0]);
//计算95%的响应时间
int ninetyFiveIndex = (int) Math.round(intervals.size() * 0.95) - 1;
int ninetyFiveInterval = Math.toIntExact(intervalsArray[ninetyFiveIndex]);
//计算平均响应时间
int size = intervals.size();
long totalTimeInterval = 0;
for (int i = 0; i < size; i++) {
System.out.println(intervalsArray[i]);
totalTimeInterval += intervalsArray[i];
}
int averageResponseTime = (int) (totalTimeInterval / size);
TestResult testResult = new TestResult();
testResult.setNinetyFivePercentile(ninetyFiveInterval);
testResult.setAverageResponseTime(averageResponseTime);
return testResult;
}
/*
inner class
*/
//线程执行体
private class RequestRunner implements Runnable {
private final CountDownLatch startLatch;
private final CountDownLatch endLatch;
private final Integer index;
private final ConcurrentMap<Integer, Long> concurrentMap;
private final String getRequestUrl;
public RequestRunner(CountDownLatch startLatch, CountDownLatch endLatch, int index, ConcurrentMap<Integer, Long> requestIntervalMap, String getRequestUrl) {
this.startLatch = startLatch;
this.endLatch = endLatch;
this.index = index;
this.concurrentMap = requestIntervalMap;
this.getRequestUrl = getRequestUrl;
}
@Override
public void run() {
//等待执行
try {
startLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//记录执行时间
long startTime = System.currentTimeMillis();
//执行请求
getRequest(getRequestUrl);
concurrentMap.put(index, System.currentTimeMillis() - startTime);
//执行完成
endLatch.countDown();
}
private void getRequest(String getRequestUrl) {
RestTemplate restTemplate = new RestTemplate();
try {
ResponseEntity<String> response = restTemplate.getForEntity(getRequestUrl, String.class);
System.out.println("请求" + this.index + ": 结果" + response.getStatusCode().value());
} catch (Exception e) {
System.out.println("请求" + this.index + ": 异常" + e.getMessage());
}
}
}
}
评论