Tomcat源码三:发布app

文章目录

  • 发布过程
    • StandardService 的startInternal() 方法
      • setState() 方法
        • HostConfig 的start方法
          • HostConfig&DeployDirectory
          • HostConfig&deployDirectory(ContextName cn, File dir)
  • StandardContext 的启动

发布过程

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
	Connector[]
		Http11NioProtocol
			NioEndpoint
				Executor[SocketProcessor]
				Poller[]
				Acceptor[]
			Http11NioProcessor
				CoyoteAdapter

StandardService 的startInternal() 方法

app的发布在 container.start() 中   容器为 StandardEngine[Catalina]

Tomcat源码三:发布app_第1张图片
最后 StandardEngine 的startInternal() 方法 走的 是ContainerBase 中的startInternal() 方法
StandardEngine[Catalina] 的子容器为 StandardEngine[Catalina].StandardHost[localhost],
子容器的启动采用的异步启动。

Tomcat源码三:发布app_第2张图片
StandardEngine[Catalina].StandardHost[localhost] 的startInternal 方法同样是调的 ContainerBase 中的startInternal() 方法,
Tomcat源码三:发布app_第3张图片
此时的StandardEngine[Catalina].StandardHost[localhost] 是没有 children 的
pipeline 为 Pipeline[StandardEngine[Catalina].StandardHost[localhost]]

setState() 方法

调用的 是 LifecycleBase中的 方法。 此 StandardHost的 lifecycle 为LifecycleSupport
Tomcat源码三:发布app_第4张图片
继续往下 listeners 为 HostConfig
Tomcat源码三:发布app_第5张图片

HostConfig 的start方法

Tomcat源码三:发布app_第6张图片

Tomcat源码三:发布app_第7张图片
总共有 examples、host-manager、manager、root 4个app ,异步交由DeployDirectory发布
Tomcat源码三:发布app_第8张图片

HostConfig&DeployDirectory

Tomcat源码三:发布app_第9张图片

HostConfig&deployDirectory(ContextName cn, File dir)

之前StandardHost 的 children 为空
现在开始为其添加child。
一个app相对于一个 StandardContext
Tomcat源码三:发布app_第10张图片
继续进入 host.addChild
== 注意 代码 addChild 所处容器的 位置,
回到头部的容器结构, 到[StandardEngine[Catalina].StandardHost[localhost]]了,添加子容器了。之后 在ContainerBase 中启动 子容器
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/examples]
Tomcat源码三:发布app_第11张图片
至此可以短暂抛弃之前的容器。以 StandardContext 作为 一个 容器单位

StandardContext 的启动

StandardContext startInternal() 方法
Tomcat源码三:发布app_第12张图片
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/examples] 的
LifecycleSupport 的listeners 有4个 元素。如下

Tomcat源码三:发布app_第13张图片

  • ContextConfig
    Tomcat源码三:发布app_第14张图片
    继续往下
    Tomcat源码三:发布app_第15张图片
  1. ContextConfig webConfig() 方法
    parseWebXml 只是将welcome-file-list listener filter servlet 等信息 读取到webXml中
    Tomcat源码三:发布app_第16张图片
    继续往下
    Tomcat源码三:发布app_第17张图片
  2. WebXml configureContext() 才是真正的装配 context

你可能感兴趣的:(JAVA,Tomcat源码)