文章目录
发布过程
app的发布 在 StandardEngine[Catalina].StandardHost[localhost] 的start方法中发布的
tomcat 容器部分结构图
意思为
StandardService 容器中有一个 StandardEngine[Catalina] 的容器
StandardEngine[Catalina] 容器中有个 StandardEngine[Catalina].StandardHost[localhost] 的 容器
StandardEngine[Catalina].StandardHost[localhost] 容器 中含有一个 带LifecycleListener [HostConfig]属性的LifecycleSupport
这个HostConfig 是发布app的核心类
StandardService
Container[StandardEngine[Catalina]]
children[StandardEngine[Catalina].StandardHost[localhost]]
Pipeline[StandardEngine[Catalina].StandardHost[localhost]]
LifecycleSupport
LifecycleListener[HostConfig]
host[StandardEngine[Catalina].StandardHost[localhost]] -- 为了将StandardContext 添加为其子容器
--> DeployDirectory.run
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/examples] --- 意思为 名为Catalina的Engine 中的 名为localhost的StandardHost 中的 一个名为/examples 的 StandardContext
WebappLoader[/examples] -- 一个StandardContext 相对于一个服务, 一个localhost 相对于一个 IP(注意双网卡的可以配置多个)。整个engine 属于servie 容器 service又属于Server 容器中
LifecycleSupport
LifecycleListener[ContextConfig] -- 最终在里面 应用web.xml 这里主要是 将web.xml中配置的信息,实例化到 StandardContext 属性中
WebXml
LifecycleListener[StandardHost$MemoryLeakTrackingListener]
LifecycleListener[TldConfig]
LifecycleListener[NamingContextListener]
Pipeline[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/examples]]
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/host-manager]
Pipeline[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/host-manager]]
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/host]
Pipeline[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/host]]
ArrayList<Executor>
Connector[]
Http11NioProtocol
NioEndpoint
Executor[SocketProcessor]
Poller[]
Acceptor[]
Http11NioProcessor
CoyoteAdapter
StandardService 的startInternal() 方法
app的发布在 container.start() 中 容器为 StandardEngine[Catalina]
最后 StandardEngine 的startInternal() 方法 走的 是ContainerBase 中的startInternal() 方法
StandardEngine[Catalina] 的子容器为 StandardEngine[Catalina].StandardHost[localhost],
子容器的启动采用的异步启动。
StandardEngine[Catalina].StandardHost[localhost] 的startInternal 方法同样是调的 ContainerBase 中的startInternal() 方法,
此时的StandardEngine[Catalina].StandardHost[localhost] 是没有 children 的
pipeline 为 Pipeline[StandardEngine[Catalina].StandardHost[localhost]]
setState() 方法
调用的 是 LifecycleBase中的 方法。 此 StandardHost的 lifecycle 为LifecycleSupport
继续往下 listeners 为 HostConfig
HostConfig 的start方法
总共有 examples、host-manager、manager、root 4个app ,异步交由DeployDirectory发布
HostConfig&DeployDirectory
HostConfig&deployDirectory(ContextName cn, File dir)
之前StandardHost 的 children 为空
现在开始为其添加child。
一个app相对于一个 StandardContext
继续进入 host.addChild
== 注意 代码 addChild 所处容器的 位置,
回到头部的容器结构, 到[StandardEngine[Catalina].StandardHost[localhost]]了,添加子容器了。之后 在ContainerBase 中启动 子容器
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/examples]
至此可以短暂抛弃之前的容器。以 StandardContext 作为 一个 容器单位
StandardContext 的启动
StandardContext startInternal() 方法
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/examples] 的
LifecycleSupport 的listeners 有4个 元素。如下
- ContextConfig
继续往下
- ContextConfig webConfig() 方法
parseWebXml 只是将welcome-file-list listener filter servlet 等信息 读取到webXml中
继续往下
- WebXml configureContext() 才是真正的装配 context