tomcat解析(十一)StandardEngine.start


首先是构造方法:
 

从层级上来看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类的处理,刚才已看过啦,还是啥事没干

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值