Tomcat源码三:发布app

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。 https://blog.csdn.net/mengxiangqihangz/article/details/88853378

发布过程

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
    在这里插入图片描述
    继续往下
    在这里插入图片描述
  1. ContextConfig webConfig() 方法
    parseWebXml 只是将welcome-file-list listener filter servlet 等信息 读取到webXml中
    在这里插入图片描述
    继续往下
    在这里插入图片描述
  2. WebXml configureContext() 才是真正的装配 context

猜你喜欢

转载自blog.csdn.net/mengxiangqihangz/article/details/88853378