728x90
반응형
서론
https://www.youtube.com/watch?v=aSTuQiPB4Ns
토비님의 유튜브 강의 내용을 정리한 글 입니다.
본론
스프링 컨트롤러 리턴타입에 따른 동작방식
#1 Object
@GetMapping("/async")
public String async() throws InterruptedException {
log.info("async");
Thread.sleep(2000);
return "hello";
}
기본 tomcat thread pool 수인 200개 까지만 동시처리가 가능하다. [링크]
https://tomcat.apache.org/tomcat-8.5-doc/config/executor.html
#2 Callable
@GetMapping("/callable")
public Callable<String> callable() throws InterruptedException {
log.info("callable");
return () -> {
log.info("async");
Thread.sleep(2000);
return "hello";
};
}
http-nio threed는 1~2개로 백그라운드 스레드를 통해 비동기 리턴을 하기 때문에 1000개 동시처리 시 2초에 가깝게 끝이 난다.
#3 DeferredResult
Queue<DeferredResult<String>> results = new ConcurrentLinkedDeque<>();
@GetMapping("/dr")
public DeferredResult<String> deferred() throws InterruptedException {
log.info("dr");
DeferredResult<String> dr = new DeferredResult<String>();
results.add(dr);
return dr;
}
@GetMapping("/dr/count")
public String drCount() {
return String.valueOf(results.size());
}
@GetMapping("/dr/event")
public String drEvent(String msg) {
for (DeferredResult<String> dr : results) {
dr.setResult("Hello " + msg);
results.remove(dr);
}
return "Ok";
}
/dr API호출 시 바로 응답이 나가는 게 아닌, /dr/event API를 통해 비동기적으로 응답을 보내줄 수 있다.
#4 ResponseBodyEmitter
@GetMapping("emitter")
public ResponseBodyEmitter emitter() {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
Executors.newSingleThreadExecutor().submit(() -> {
try {
for (int i = 1; i <= 50; i++) {
emitter.send("<p>Stream " + i + "</p>");
Thread.sleep(2000);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
return emitter;
}
ResponseBodyEmitter를 먼저 리턴하고, 비동기적으로 send()를 통해 데이터를 넘길 수 있다.
728x90
반응형
'JVM > Spring' 카테고리의 다른 글
[Toby Spring Reactive Programming] 비동기 RestTemplate과 비동기 MVC/Serlvet (5) (0) | 2023.10.21 |
---|---|
[Toby Spring Reactive Programming] Schedulers (3) (1) | 2023.10.15 |
[Toby Spring Reactive Programming] Operators (2) (2) | 2023.10.15 |
[Toby Spring Reactive Programming] Reactive Streams 시작 (1) (0) | 2023.10.13 |
[Spring] h2 설정 (0) | 2023.01.29 |