관리 메뉴

HAMA 블로그

톰캣 최종분석 ex14 소스 분석 본문

WAS & 웹서버

톰캣 최종분석 ex14 소스 분석

[하마] 이승현 (wowlsh93@gmail.com) 2015. 8. 24. 16:32



  톰캣의 컴포넌트 포함관계는 위의 그림과 같다.

  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
Comments