Tomcat源码解析系列(六)Host

前言

上篇文章讲到了 Engine 的 init 和 start 方法,在 Engine 的 start(ContainerBase#startInternal) 方法里调用了子容器的 start 方法,而 Engine 的子容器就是 Host。在 Engine 的 init 方法中并没有调用子容器的 init 方法,而是在 start 方法中调用子容器的 start 方法的时候,在 LifecycleBase 方法里 调用了子容器的 init 方法。

1 Host#initInternal 方法

Host 的实现类是 StandardHost。StandardHost 也是继承自 ContainerBase,但是没有重载 initInternal 方法。因此,在调用 Host#init 方法的时候,执行的是 ContainerBase#initInternal 方法,关于 ContainerBase#initInternal 在上篇文章就讲过了,这里不再赘述。

2 Host#startInternal 方法

/**
 * 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 对象里。

然后调用 ContainerBase 的 startInternal 方法,ContainerBase#startInternal 方法在上篇文章也讲到了,这里就不多讲了。

2 Host#backgroundProcess 方法

上篇文章分析了,StandardEngine 在调用父类 ContainerBase 的 startInternal 的时候递归调用了子容器的 backgroundProcess 方法。

StandardHost 没有重载 backgroundProcess 方法,因此调用 backgroundProcess 方法时,执行的还是 ContainerBase 的 backgroundProcess 方法,这在上篇文章就分析过了,这里不再多说了。

小结

本篇文章简单的 StandardHost 的 init 和 start 方法。StandardHost 有一些重要的属性,比如,appBase、autoDeploy、unpackWARs 等。

原文 

https://segmentfault.com/a/1190000022064349

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Tomcat源码解析系列(六)Host

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址