[SpringBoot] Embedded Tomcat, NioEndpoint
JAVA/Spring2019. 6. 11. 19:22
SpringBoot Async 처리를 다시 학습 중에
어떻게 Embedded Tomcat에서는 요청을 처리하고 있는지 파악하기 위해 조금 코드를 살펴봤다.
일단 크게 별다른 설정을 하지 않고 디버그 모드로 붙었을 때 아래와 같이 스레드가 떠있다.
대략 오늘 살펴보려는 스레드는 4가지 정도다
- http-nio-8080-Acceptor-0
- Http Port accept 하는 스레드(ServerSocket.accept())
- 관련 클래스는 org.apache.tomcat.util.net.Acceptor
- accept 되면 getpoller() 후 채널을 regist 한다
- getpoller는 poller가 여러 개의 경우 rr로 동작한다.
- http-nio-8080-ClientPoller-0~1
- Accept 된 Socket을 Selector에 OP_READ를 등록하고 Selector를 epoll 한다.
- 관련 클래스는 org.apache.tomcat.util.net.NioEndpoint$Poller
- 요청이 들어오면(read가 불리면), ThreadPoolExecutor.execute를 부르게 되고, 결국에 TaskQueue에 offer()를 부르게 된다.
- poller가 하나가 아니라서 어떤 기준으로 동작 하나 살펴보니 아래와 같이 값이 설정되어있으며
- polle는 많아도 2개
- 기본 동작은 selector는 select()로 blocking이 아닌 select(1000), 1초마다 깨어 난다.
- http-nio-8080-exec-1~10
- 실제 ServletThread
- TaskQueue(BlockingQueue)를 take 하며 대기, poller 혹은 다른 곳에서 TaskQueue에 이벤트를 넣어주면 동작
- 선후 처리 및 Controller 코드가 보통 이 스레드를 통해 불리게 되며 Async 처리 이후 다시 돌아와(받은 스레드가 대기하여 다시 돌아온다는 이야기는 아니고, ServletThread->Async->ServletThread) 처리
- MvcAsync
- Controller에서 Async 처리(Callable이라던지 기타 등등..) 이후 응답을 직접 하려나? 해서 살펴보니
- 마지막에 다시 TaskQueue에 offer를 하고 있었다.
전체 처리를 대략적으로 그리면 아래와 같이 될 것 같다.
'JAVA > Spring' 카테고리의 다른 글
Spring Boot Toy 프로젝트 세션 클러스터링-1 (0) | 2019.07.04 |
---|---|
Spring Cloud Config Server (0) | 2019.06.25 |
[Spring][Thymeleaf] if else그리고 조건문 (2) | 2019.05.22 |
@ModelAttribute, Controller 메소드에 붙였을때 (0) | 2019.05.20 |
[Spring] ApplicationEventPublisher, AbstractApplicationEventMulticaster (0) | 2019.04.30 |
댓글()