일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 엔터프라이즈 블록체인
- Akka
- Play2
- Adapter 패턴
- 안드로이드 웹뷰
- 하이브리드앱
- 스위프트
- 플레이프레임워크
- Actor
- play2 강좌
- 스칼라 강좌
- 파이썬
- Golang
- akka 강좌
- 파이썬 머신러닝
- 스칼라
- 이더리움
- 하이퍼레저 패브릭
- 그라파나
- 파이썬 데이터분석
- Play2 로 웹 개발
- CORDA
- 파이썬 동시성
- play 강좌
- 블록체인
- hyperledger fabric
- 스칼라 동시성
- 주키퍼
- 파이썬 강좌
- Hyperledger fabric gossip protocol
- Today
- Total
HAMA 블로그
톰캣 최종분석 ex14 소스 분석 본문
톰캣의 컴포넌트 포함관계는 위의 그림과 같다.
Bootstrap > Server > Service > Connector , Engine > Host > Context > Loader, Wrapper
1. 서버
- 카탈리나 서블릿 컨테이너 전체를 나타냄 + 다른 모든 컴포넌트를 포함.
- 전체 시스템을 시작하고 종료할수 있다.
- server.xml 파일과 연관되있다.
- start() 메소드에서는 , 모든 서비스들을 시작한다. (http://dbdb.tistory.com/3)
- await() 함수안에서 8085 포트로 생성한 서버소켓에 시스템 종료 메세지기 올때까지 기다린다.
2. 서비스
- 1개의 컨테이너나 1개 이상의 커넥터등의 컴포넌트를 포함한다.
- 여러개의 커넥터를 가짐으로서 톰캣은 여러 프로토콜(http, https)에 대해 서비스하는것이 가능해진다.
- 서비스와 연결된 컨테이너는 각 커넥터의 setContainer 메소드에 전달되어 서로 연결된다.
3. 엔진
- 컨테이너 인터페이스를 상속받는다. (최상위 컨테이너 역할을 한다)
- 카탈리나 서블릿 엔진 전체를 나타낸다.
- 여러개의 가상 호스트를 지원하고 싶다면 엔진을 사용해야 할것이다.(http://dbdb.tistory.com/4)
- 엔진이 사용되면 엔진은 항상 최상위의 컨테이너가 된다.
- 엔진에 추가되는 하위 컨테이너는 보통 Host 나 Context 를 구현한 컨테이너이다.
- 기본적으로 톰캣 배포본에서는 엔진이 사용되며, 엔진은 하나의 기본 호스트를 갖는다.
4. 호스트
- 컨테이너 인터페이스를 상속받는다.
- 최상위 컨테이너로 호스트를 사용할수도 있다. (엔진을 사용하면 호스트가 차일드)
- 각 컨텍스트가 ContextConfig 를 사용하도록 설정 되 있다면 반드시 호스트가 존재한다.
- 컨텍스트의 상위 컨테이너는 일반적으로 호스트이지만, 다른 컨테이너의 구현을 사용하거나
필요없다면 생략될 수도 있다. (실제 상황에서는 톰캣은 항상 호스트를 필요로한다)
5. 컨텍스트
- Context 인터페이스를 상속받는다. (StandardContext 가 구현체)
- 하나의 웹 어플리케이션을 나타내며 1개 이상의 래퍼를 포함한다.
- 로더와 매니저를 필요로한다.
- start() 메소드가 호출되야한다.
- %CATALINA_HOME%/conf 디렉토리에 있는 기본 web.xml 내용을 파싱해, 배치돼있는 모든
애플리케이션에 적용할수 있도록 준비한다.
- 각 애플리케이션수준의 web.xml 을 처리한다.
- 각종 밸브 (인증자, 증명등)를 처리한다.
* start() 메소드에서 하는일
가. BEFORE_START_EVENT 이벤트 발생
나. available 특성의 값을 false 로 지정
다. configured 특성의 값을 false 로 지정
라. 자원준비
마. 로더 준비
바. 매니저 준비
사. 문자셋 맵퍼 초기화
아. 이 컨텍스트와 연관된 다른 컴포넌트 구동
자. 하위 컨테이너(래퍼) 구동
차. 파이프라인 구동
카. 매니저 구동
파. START_EVENT 이벤트 발생 (리스너 (ContextConfig) 는 몇가지 설정 작업을 수행)
타. configured 값 확인
하. AFTER_START_EVENT 이벤트 발생
6. 로더
- 컨텍스트마다 하나의 클래스 로더가 존재한다. 따라서 컨텍스트끼리 클래스 공유는 안된다.
7. 래퍼
- 하나의 서블릿을 래핑한다.
시작 소스 예제
public final class Bootstrap {
public static void main(String[] args) {
System.setProperty("catalina.base", System.getProperty("user.dir"));
Connector connector = new HttpConnector();
Wrapper wrapper1 = new StandardWrapper();
wrapper1.setName("Primitive");
wrapper1.setServletClass("PrimitiveServlet");
Wrapper wrapper2 = new StandardWrapper();
wrapper2.setName("Modern");
wrapper2.setServletClass("ModernServlet");
Context context = new StandardContext();
// StandardContext's start method adds a default mapper
context.setPath("/app1");
context.setDocBase("app1");
context.addChild(wrapper1);
context.addChild(wrapper2);
LifecycleListener listener = new SimpleContextConfig();
((Lifecycle) context).addLifecycleListener(listener);
Host host = new StandardHost();
host.addChild(context);
host.setName("localhost");
host.setAppBase("webapps");
Loader loader = new WebappLoader();
context.setLoader(loader);
// context.addServletMapping(pattern, name);
context.addServletMapping("/Primitive", "Primitive");
context.addServletMapping("/Modern", "Modern");
Engine engine = new StandardEngine();
engine.addChild(host);
engine.setDefaultHost("localhost");
Service service = new StandardService();
service.setName("Stand-alone Service");
Server server = new StandardServer();
server.addService(service);
service.addConnector(connector);
//StandardService class's setContainer will call all its connector's setContainer method
service.setContainer(engine);
// Start the new server
if (server instanceof Lifecycle) {
try {
server.initialize();
((Lifecycle) server).start();
server.await();
// the program waits until the await method returns,
// i.e. until a shutdown command is received.
}
catch (LifecycleException e) {
e.printStackTrace(System.out);
}
}
// Shut down the server
if (server instanceof Lifecycle) {
try {
((Lifecycle) server).stop();
}
catch (LifecycleException e) {
e.printStackTrace(System.out);
}
}
}
}
리눅스에서 애플리케이션 시작하기
java -classpath ./lib/servelt.jar:./lib/commons-collections.jar:./commons-digester.jar:./libnaming-factory.jar:./lib/naming-common.jar:./lib/tomcat-util.jar:./ ex14.pyrmont.startup.Bootstrap
중지하기
java ex14.pyrmont.startup.Stopper
서블릿 호출하기
http://localhost:8080/app1/Primitive
'WAS & 웹서버' 카테고리의 다른 글
톰캣 최종분석 ex05 소스 분석 (0) | 2015.08.15 |
---|---|
톰캣 클래스패스의 이해 (번역) (0) | 2015.07.31 |