일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 블록체인
- Play2
- 엔터프라이즈 블록체인
- CORDA
- Hyperledger fabric gossip protocol
- Play2 로 웹 개발
- 스칼라
- 파이썬 데이터분석
- 하이퍼레저 패브릭
- 파이썬 동시성
- 그라파나
- 파이썬
- 이더리움
- Golang
- hyperledger fabric
- play2 강좌
- Adapter 패턴
- 안드로이드 웹뷰
- Actor
- 스칼라 강좌
- 스위프트
- akka 강좌
- 파이썬 강좌
- Akka
- 스칼라 동시성
- 파이썬 머신러닝
- 플레이프레임워크
- 하이브리드앱
- play 강좌
- 주키퍼
- Today
- Total
HAMA 블로그
톰캣 최종분석 ex05 소스 분석 본문
1. main 으로 시작한다. (크게 2개의 컴포넌트(?) 로 나누어진다. HTTPConnector 와 SimpleContext)
2. main 은 각각의 클래스들의 객체를 생성하고 의존관계를 맺은 후에 HttpConnector 의 start 를 호출하여
솔루션이 시작된다.
3. 크게 2가지 파이프라이닝이 있다. ( 파이프라인에 대한건 chain of responsibility 패턴이나 , intercepting
filter 패턴을 알면 이해하기 쉽다) . 이걸 이해해야한다.
4. SimplePipiline 은 intercepting filter 패턴에서 매니저 역할이다. 이것은 각각의 valve (filter 와 같다) 를 순
회하며 각각의 선행작업을 한후에 마지막에 basic 작업을 하며 종료한다. 마치 필터들이 선행해서 어떤 액션
을 한후에 마지막에 컨트롤러가 마무리하는것과 같다.
5. SimpleLoader 는 서블릿 클래스를 메모리로 올리는 유틸리티성 클래스이다.
6. HTTPConnector 는 젤 앞에서 서버소켓을 운용하며, 클라이언트과 커낵션을 맺고, request/ response 객
체를 생성하여 SimpleContext 객체에 invoke 한다.
7. SimpelContextMapper 는 내부의 맵을 이용하여 url 에 맞는 서블릿을 리턴해준다.
8. SimpleWrapper A 는 A 서블릿의 래퍼이다.
9. 중요한 2가지 파이프라이닝에 대해서 알아보자.
10. 첫번째 파이프라이닝은 SimpleContext 가 가지고있는데 , 해당 파이프라이닝은 value 로써
ClientIPLoggerValve 와 HeaderLogerValue 를 가지고있으면 마지막 basic 은 SimpleContextValve 를 호
출하며 끝마친다.
예상하듯이 앞의 두 밸브는 필터역할을 하며, 마지막 SimpleContextValve 는 클라이언트가 요청하는 서
블릿을 찾아내어 해당 서블릿의 파이프라이닝을 시작한다.
11. 두번째 파이프라이닝은 SimpelWrapper A 에 등록된 valve 를 따라가며 진행되는데, 이 예제에서는 선행
valve 는 없으며 마지막 basic 이 SimpleWrapperValve 이다.
SimpleWrapperValve 의 역할은 클라이언트가 요청한 서블릿의 service 메소드를 호출하는것이다.
결국 우리가 어떤 서블릿(컨트롤러) 를 만들어서 톰캣이나 스프링에 설정해두면, SimpleWrapperValve
이 해당 컨트롤러를 호출하게되는것이다.
아래 코드는 SimpleWrapperValve 의 invoke 함수이다.
public void invoke(Request request, Response response, ValveContext valveContext)
throws IOException, ServletException {
SimpleWrapper wrapper = (SimpleWrapper) getContainer();
ServletRequest sreq = request.getRequest();
ServletResponse sres = response.getResponse();
Servlet servlet = null;
HttpServletRequest hreq = null;
if (sreq instanceof HttpServletRequest)
hreq = (HttpServletRequest) sreq;
HttpServletResponse hres = null;
if (sres instanceof HttpServletResponse)
hres = (HttpServletResponse) sres;
// Allocate a servlet instance to process this request
try {
servlet = wrapper.allocate();
if (hres!=null && hreq!=null) {
servlet.service(hreq, hres);
}
else {
servlet.service(sreq, sres);
}
}
catch (ServletException e) {
}
}
'WAS & 웹서버' 카테고리의 다른 글
톰캣 최종분석 ex14 소스 분석 (0) | 2015.08.24 |
---|---|
톰캣 클래스패스의 이해 (번역) (0) | 2015.07.31 |