《How Tomcat Works》 독서노트(6) Lifecycle

7010 단어 tomcat
Tomcat에는 많은 구성 요소가 있습니다. Tomcat가 시작되는 동시에 이 구성 요소들도 함께 시작해야 합니다. Tomcat이 멈추기 전에 이 구성 요소들은 자신의 마무리 작업을 완성할 기회가 필요합니다.
이전에 servlet의 생명주기에 대해 언급한 적이 있다. 지난 절에서 우리는 하나의 Wrapper가 하나의 서브렛을 대표하고 하나의 Context는 많은 Wrapper를 가질 수 있다는 것을 알았다.Context가 멈추면, Wrapper의stop 방법을 사용하고, Wrapper는 servlet의destory 방법을 사용합니다.
하나의 구성 요소는 org만 실현할 수 있습니다.apache.catalina.Lifecycle은 자신의 라이프 사이클을 관리할 수 있습니다.
Lifecycle의 인터페이스 정의를 살펴보십시오.
public interface Lifecycle {
    //                 
    public static final String START_EVENT = "start";
    public static final String BEFORE_START_EVENT = "before_start";
    public static final String AFTER_START_EVENT = "after_start";
    public static final String STOP_EVENT = "stop";
    public static final String BEFORE_STOP_EVENT = "before_stop";
    public static final String AFTER_STOP_EVENT = "after_stop";
    //     
    public void addLifecycleListener(LifecycleListener listener);
    public LifecycleListener[] findLifecycleListeners();
    public void removeLifecycleListener(LifecycleListener listener);
    //      
    public void start() throws LifecycleException;
    public void stop() throws LifecycleException;
}

start 및
stop은 가장 중요한 두 가지 방법입니다. 부모 구성 요소가 start/stop에 있을 때 하위 구성 요소의 start/stop 방법을 사용해서 시작/정지를 완성합니다.
Lifecycle에는 라이프 사이클 이벤트의 이름만 표시되어 있습니다.
4
public final class LifecycleEvent extends EventObject {
    public LifecycleEvent(Lifecycle lifecycle, String type) {
        this(lifecycle, type, null);
    }
    public LifecycleEvent(Lifecycle lifecycle, String type, Object data) {
        super(lifecycle);
        this.lifecycle = lifecycle;
        this.type = type;
        this.data = data;
    }
    private Object data = null;
    private Lifecycle lifecycle = null;
    private String type = null;
    public Object getData() {
        return (this.data);
    }
    public Lifecycle getLifecycle() {
        return (this.lifecycle);
    }
    public String getType() {
        return (this.type);
    }
}
모니터 인터페이스 LifecycleListener 다시 보기:
public interface LifecycleListener {
    //                   
    public void lifecycleEvent(LifecycleEvent event);
}

감청기는 어떻게 자신이 흥미를 느끼는 사건을 등록합니까?Lifecycle Support라는 도움말이 필요합니다.
public final class LifecycleSupport {
    public LifecycleSupport(Lifecycle lifecycle) {
        super();
        this.lifecycle = lifecycle;
    }
    //       Lifecycle   Tomcat  
    private Lifecycle lifecycle = null;
    //     
    private LifecycleListener listeners[] = new LifecycleListener[0];

    public void addLifecycleListener(LifecycleListener listener) {
      synchronized (listeners) {
          LifecycleListener results[] =
            new LifecycleListener[listeners.length + 1];
          for (int i = 0; i < listeners.length; i++)
              results[i] = listeners[i];
          results[listeners.length] = listener;
          listeners = results;
      }
    }
    public LifecycleListener[] findLifecycleListeners() {
        return listeners;
    }
    //    
    public void fireLifecycleEvent(String type, Object data) {
        //    
        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
        LifecycleListener interested[] = null;
        //       
        synchronized (listeners) {
            interested = (LifecycleListener[]) listeners.clone();
        }
        //                
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);
    }
    public void removeLifecycleListener(LifecycleListener listener) {
        synchronized (listeners) {
            int n = -1;
            for (int i = 0; i < listeners.length; i++) {
                if (listeners[i] == listener) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;
            LifecycleListener results[] =
              new LifecycleListener[listeners.length - 1];
            int j = 0;
            for (int i = 0; i < listeners.length; i++) {
                if (i != n)
                    results[j++] = listeners[i];
            }
            listeners = results;
        }
    }
}

다음 간단한 Context는 어떻게 하위 구성 요소, 하위 용기, 생명주기 이벤트와 감청기를 시작하거나 멈추는지 보여 줍니다.
public class SimpleContext implements Context, Pipeline, Lifecycle {
    // SimpleContext        
    protected LifecycleSupport lifecycle = new LifecycleSupport(this);
    //          
    public void addLifecycleListener(LifecycleListener listener) {
        lifecycle.addLifecycleListener(listener);
    }
    public LifecycleListener[] findLifecycleListeners() {
        return null;
    }
    public void removeLifecycleListener(LifecycleListener listener) {
        lifecycle.removeLifecycleListener(listener);
    }
    public synchronized void start() throws LifecycleException {
        if (started) throw new LifecycleException("SimpleContext has already started");
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
        started = true;
        try {
            if ((loader != null) && (loader instanceof Lifecycle))
                ((Lifecycle) loader).start();
            //     
            Container Children[] = findChildren();
            for (int i = 0; i < children.length; i++) {
                if (children[i] instanceof Lifecycle)
                    ((Lifecycle) children[i]).start();
            }
            //  pipeline  value(  baseValue)
            if (pipeline instanceof Lifecycle)
                ((Lifecycle) pipeline).start();
            //       
            lifecycle.firelifecycleEvent(START_EVENT, null);
        } catch (Exception e) {
            e.printStackTrace();
        } 
        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
    }
    public void stop() throws LifecycleException {
        if (!started) throw new LifecycleException("SimpleContext has not been started"); 
        lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);
        lifecycle.fireLifecycleEvent(STOP_EVENT, null);
        started = false;
        try {
            if (pipeline instanceof Lifecycle){
                ((Lifecycle) pipeline).stop();
            }
            Container children[] = findChildren();
            for (int i = 0; i < children.length; i++) {
                if (children[i] instanceof Lifecycle)
                    ((Lifecycle) children[i]).stop();
            }
            if ((loader != null) && (loader instanceof Lifecycle)) {
                ((Lifecycle) loader).stop();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null);
}

라이프스케일 인터페이스는 구성 요소의 생명 주기를 정의하고 구성 요소에 이벤트를 전달하는 우아한 방식을 제공합니다.또한 Lifecycle 인터페이스를 통해 Tomcat은 모든 구성 요소를 "원키"로 시작하거나 정지할 수 있습니다.

좋은 웹페이지 즐겨찾기