토비님의 리액티브 스프링 강좌를 보는데 HTTP 요청을 100개 보내는 java 코드를 사용한다.
해당 코드는 추후에도 내가 다른 곳에서 쓸 수 있을 거 같아서 여기에 기록해 둔다.
참고로
spring-boot
프로젝트이며, gradle 의 dependency 로는
spring-boot-starter-web
,Lombok
정도의 의존성만 있어도 된다.
package me.dailycode.tobyreactive._05_async_restteamplate_and_mvc_servlet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate;
import java.util.Objects;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
public class LoadTester {
static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args)
throws InterruptedException, BrokenBarrierException {
ExecutorService es = Executors.newFixedThreadPool(100);
RestTemplate rt = new RestTemplate();
String url = "http://localhost:8080/rest?idx={idx}";
CyclicBarrier barrier = new CyclicBarrier(101);
StopWatch mainWatch = new StopWatch();
mainWatch.start();
for (int i = 0; i < 100; i++) {
es.submit(() -> {
int idx = counter.addAndGet(1);
barrier.await();
log.info("Thread {}", idx);
StopWatch threadWatch = new StopWatch();
threadWatch.start();
String res = rt.getForObject(url, String.class, idx);
threadWatch.stop();
log.info("Thread {} -> Elapsed: {} / {}",
idx, threadWatch.getTotalTimeSeconds(), res);
return (Void)null;
});
}
barrier.await();
es.shutdown();
es.awaitTermination(100, TimeUnit.SECONDS);
mainWatch.stop();
log.info("Total: {}", mainWatch.getTotalTimeSeconds());
}
}