Tomcat源碼解析系列(六)Host

前言
上篇文章講到了 Engine 的 init 和 start 方法,在 Engine 的 start(ContainerBase#startInternal) 方法裏調用了子容器的 start 方法,而 Engine 的子容器就是 Host。在 Engine 的 init 方法中並無調用子容器的 init 方法,而是在 start 方法中調用子容器的 start 方法的時候,在 LifecycleBase 方法裏 調用了子容器的 init 方法。web


1 Host#initInternal 方法
Host 的實現類是 StandardHost。StandardHost 也是繼承自 ContainerBase,可是沒有重載 initInternal 方法。所以,在調用 Host#init 方法的時候,執行的是 ContainerBase#initInternal 方法,關於 ContainerBase#initInternal 在上篇文章就講過了,這裏再也不贅述。apache

2 Host#startInternal 方法app

/**
 * Start this component and implement the requirements
 * of {@link org.apache.catalina.util.LifecycleBase#startInternal()}.
 *
 * @exception LifecycleException if this component detects a fatal error
 *  that prevents this component from being used
 */
@Override
protected synchronized void startInternal() throws LifecycleException {

    // Set error report valve
    String errorValve = getErrorReportValveClass();
    if ((errorValve != null) && (!errorValve.equals(""))) {
        try {
            boolean found = false;
            Valve[] valves = getPipeline().getValves();
            for (Valve valve : valves) {
                if (errorValve.equals(valve.getClass().getName())) {
                    found = true;
                    break;
                }
            }
            if(!found) {
                Valve valve =
                    (Valve) Class.forName(errorValve).getConstructor().newInstance();
                getPipeline().addValve(valve);
            }
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            log.error(sm.getString(
                    "standardHost.invalidErrorReportValveClass",
                    errorValve), t);
        }
    }
    super.startInternal();
}

public String getErrorReportValveClass() {
    return this.errorReportValveClass;
}

/**
 * The Java class name of the default error reporter implementation class
 * for deployed web applications.
 */
private String errorReportValveClass =
    "org.apache.catalina.valves.ErrorReportValve";

Host#startInternal 的邏輯很簡單,就是看本身的 Pipeline 對象裏是否包含了 org.apache.catalina.valves.ErrorReportValve 這個 Valve 對象,若是沒有,就添加一個 org.apache.catalina.valves.ErrorReportValve 到本身的 Pipeline 對象裏。ide

而後調用 ContainerBase 的 startInternal 方法,ContainerBase#startInternal 方法在上篇文章也講到了,這裏就很少講了。ui

2 Host#backgroundProcess 方法
上篇文章分析了,StandardEngine 在調用父類 ContainerBase 的 startInternal 的時候遞歸調用了子容器的 backgroundProcess 方法。
StandardHost 沒有重載 backgroundProcess 方法,所以調用 backgroundProcess 方法時,執行的仍是 ContainerBase 的 backgroundProcess 方法,這在上篇文章就分析過了,這裏再也不多說了。this


小結
本篇文章簡單的 StandardHost 的 init 和 start 方法。StandardHost 有一些重要的屬性,好比,appBase、autoDeploy、unpackWARs 等。code

相關文章
相關標籤/搜索