cundeng 发表于 2017-2-10 12:34:03

Tomcat源码解读--代码走读之(二十一的2-2)StandardHost.start(二十三)

  当前对象为StandardEngine。
  


 
 
  1、将HashMap<String,Container> children =new HashMap<String,Container>(),转换为数组。复制给children[]。其中children是通过第六节注入进去,也就是server.xml中的<host>。
  2、进行.StandardHost]的start()方法进行启动。类继承关系是class StandardHostextends ContainerBase implements Host,abstract classContainerBase extends LifecycleMBeanBase implements Container。
  3、调用LifecycleBase的start()方法。
  (1)、init()方法,当前对象StandardEngine.StandardHost
  1)、setStateInternal(LifecycleState.INITIALIZING, null, false);因为standardHost的listeners的数量为1,所以去执行里面的listeners方法。
  1))、HostConfig在before_init的事件中,主要是设置一些属,setCopyXML(false);
  setDeployXML(true);setUnpackWARs(true);
  2)、initInternal();主要是注册mbean。
  3)、setStateInternal(LifecycleState.INITIALIZED, null, false);步骤跟1)类似。
  (2)、setStateInternal(LifecycleState.STARTING_PREP, null, false);步骤跟(1)中的1)类似。
  (3)startInternal(),当前对象为StandardEngine.StandardHost,调用StandardHost的startInternal()方法。
  


 
 
  1)、得到字符串errorValve=“org.apache.catalina.valves.ErrorReportValve”。
  2)、获取pipeline的valves。
  1))、pipeline是在继承ContainerBase的类,构建对象的时候创建。
  


 
 
  2))、创建的时候传入当前的container也是就this.也就是设置container,CatalinaFactory的类中。
  


 
 
  3))、创建当前对象的时候设置Basic,StandardHost的类中。
  


 
 
  4))、追加basic到Value。StandardPipeline的类中。
  


 
 
  3)、让pipeline(StandardPipeline)增加一个org.apache.catalina.valves.ErrorReportValve。
  


 
 
  1))、设置valve的container为StandardHost
  2))、进行重新设置valve的顺序,AccessLogValve,ErrorReportValve,StandardHostValve
  3))、container.fireContainerEvent(Container.ADD_VALVE_EVENT, valve);如下图,StandardHost的cb(ContainerBase)的listeners为0,return返回,图中的代码为ContainerBase的类中,其中listeners为ContainerBase的protectedArrayList<ContainerListener> listeners = new ArrayList<ContainerListener>();与之前提到的listeners不同的之处是,前面的为LifecycleSupport的在LifecycleBase的属性中,现在提到的是ContainerBase的属性。
  


 
 
  4)、调用父类ContainerBase的startInternal(),进行Pipeline.StandardHost]的启动。
  


 
 
1))、进行Pipeline.StandardHost]的启动,后续介绍。
2))、setState(LifecycleState.STARTING),后续介绍。
3))、threadStart(),后续介绍。
  (4)、setStateInternal(LifecycleState.STARTED,null, false),当前对象为StandardEngine.StandardHost。步骤跟(1)中的1)类似。
页: [1]
查看完整版本: Tomcat源码解读--代码走读之(二十一的2-2)StandardHost.start(二十三)