首先是构造方法:
从层级上来看StandardEngine在StandardService之下,而在StandardEngine之下的还有StandardHost及StandardContext,其中StandardEngine,StandardHost及StandardContext继承自ContainerBase类,而该类持有一个管道变量
/**
* The Pipeline object with which this Container is associated.
*/
protected Pipeline pipeline = new StandardPipeline(this);
而StandardEngine的构造方法则是为其设置了new StandardEngineValve()的对象,具体有何作用,后续再讲
这里先看一下start方法的代码:
其中init()方法如下:
除了注册MBean外,还有一段service.initialize的调用,上一篇已讲过,调用StandardService.setContainer方法时除了会将StandardEngine设置到StandardService的container对象中外,还会将StandardService对象设置到StandardEngine的service对象,因此这段代码其实是又调用了StandardService类的initialize方法,从上一篇的代码中可以看到,该方法被调用的时候都会判断一下是否被调用过,因此其实这里不会重复执行StandardService的初始化内容
在运行完init方法后.又做了一些MBean注册的动作,最后调用了super.start(),让我们看看父类ContainerBase的start()方法里做了什么
主要内容有四部分:
1.lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
触发一个BEFORE_START_EVENT事件,这里我们需要知道注册为StandardEngine的监听器类为何类,可看生成StandardEngine类的Rule设置处,Catalina.createStartDigester处有
digester.addRuleSet(new EngineRuleSet("Server/Service/"));
EngineRuleSet里有如下代码:
可以看到其listener类型为org.apache.catalina.startup.EngineConfig,其事件处理的实现如下:
而EngineConfig类没有对BEFORE_START_EVENT事件进行处理,因此这里无做啥事
2.调用其持有的loader,manager,cluster,realm,resources,children,pipeline的start()方法
我们将主要看一下children.start,涉及到服务器启动主要流程的内容,但children从何而来呢?可以看到是由standardEngine的addChild方法设置 进来的,但它是什么时候调用的呢?它是解析<Host>标签时触发的,可以看看Catalina.createStartDigester下有
digester.addRuleSet(new HostRuleSet("Server/Service/Engine/"));
HostRuleSet中有如下代码:
可以看到实例化了StandardHost对象,并设置了其监听器类型为org.apache.catalina.startup.HostConfig,并且调用了StandardEngine.addChild方法,因此此处将调用StandardHost.start()
3.lifecycle.fireLifecycleEvent(START_EVENT, null);
触发一个START_EVENT事件,该事件对应调用其start()方法,如下:
也就打了一句log
4.threadStart();内容如下:
可以看到,该线程递归运行相应容器类的container.backgroundProcess方法,而它则会运行ContainerBase的backgroundProcess方法,如下:
这些方法都是一些后台处理的操作,其实与服务器启动主流程没有太多的关系,但有一点需要了解的是
lifecycle.fireLifecycleEvent(Lifecycle.PERIODIC_EVENT, null);
这行代码将触发一个Lifecycle.PERIODIC_EVENT的事件,在HostConfig类中(该类为StandardHost的Lifecycle监听器),因为StandardHost与StandardEngine继承一样的父类,因此在StandardHost的start方法中调用super.start后也将触发一样的事件,而事件的监听者则为HostConfig,通过监听此事件将运行其check方法,如下:
该方法将重新扫描各个context,若有变化,则会重新进行部署
5.lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
触发一个AFTER_START_EVENT事件,具体仍看org.apache.catalina.startup.EngineConfig类的处理,刚才已看过啦,还是啥事没干