《How Tomcat Works》 독서노트(6) Lifecycle
7010 단어 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은 모든 구성 요소를 "원키"로 시작하거나 정지할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
EC2 인스턴스에 Tomcat 설치전제 조건: Amazon 계정이 있어야 합니다. Amazon 계정에 로그인하고 EC2 인스턴스를 시작합니다. 여기에서 프리 티어를 선택했고 Amazon Linux 2를 실행하는 EC2 인스턴스를 시작했습니다. 시작 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.