[Spring] HTTP 요청 100개를 동시에 날리기

식빵·2022년 6월 5일
0

Spring Lab

목록 보기
10/33
post-thumbnail

토비님의 리액티브 스프링 강좌를 보는데 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());

    }
}
profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글