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

当前对象为StandardEngine[Catalina]。




 
 

1、将HashMap<String,Container> children =new HashMap<String,Container>(),转换为数组。复制给children[]。其中children是通过第六节注入进去,也就是server.xml中的<host>。

2、进行[StandardEngine[Catalina].StandardHost[localhost]]的start()方法进行启动。类继承关系是class StandardHostextends ContainerBase implements Host,abstract classContainerBase extends LifecycleMBeanBase implements Container。

3、调用LifecycleBase的start()方法。

    (1)、init()方法,当前对象StandardEngine[Catalina].StandardHost[localhost]

         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[Catalina].StandardHost[localhost],调用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[StandardEngine[Catalina].StandardHost[localhost]]的启动。




 
 

1))、进行Pipeline[StandardEngine[Catalina].StandardHost[localhost]]的启动,后续介绍。

2))、setState(LifecycleState.STARTING),后续介绍。

3))、threadStart(),后续介绍。

    (4)、setStateInternal(LifecycleState.STARTED,null, false),当前对象为StandardEngine[Catalina].StandardHost[localhost]。步骤跟(1)中的1)类似。

猜你喜欢

转载自83519144.iteye.com/blog/1886990