热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tomcat源码重要流程

一.容器的启动过程UML图例说明:实心箭头表示同步调用;空心箭头表示异步调用。图例说明:1.引导类Bootstrap负责引导,在其init方法内部创建容器启动所需的


一. 容器的启动过程

UML图例说明:

实心箭头表示同步调用;空心箭头表示异步调用。


图例说明:

1. 引导类Bootstrap负责引导,在其init方法内部创建容器启动所需的类加载器,以及用于JMX监控的MBeanServer

 

2. Bootstrap调用Catalina的load()方法加载Server的配置(也就是server.xml),将加载的配置信息委托给Digester类进行相关内容的解析。

 

3. Catalina获取到Server的配置信息后,执行StandardServer容器的init()方法。Tomcat的所有容器类都实现了统一的Lifecycle接口,由基类LifecycleBase提供统一的init方法来负责处理容器的状态,调用模板方法initInternal来处理各个容器自身所负责的内容。关于Tomcat的容器结构可以参看本系列文章的《Tomcat7源码解读(一)——容器静态结构概述》。StandardServer容器在其initInternal()方法中完成Mbean的设定,GlobalNamingResources的初始化和类加载器的设置。然后执行StandardService容器的init方法。

 

4.  StandardService同StandardServer容器,由基类LifecycleBase完成容器的生命周期状态设定,而在initInternal()方法中启动Container,Executor,Connector的init方法。

 

5.  Connector容器主要将CoyoteAdapter传递给ProtocolHandler,完成对于继续启用ProtocolHandler的初始化,关于ProtocolHandler在后面详细讲解。

 

6.  Tomcat包含了4中不同的Container容器,从外到内分别为Engine,Host,Context,Wrapper。每一个容器都继承了ContainerBase类,在ContainerBase类的初始化中容器的启动线程,多线程异步启动各个容器。

 

7.  StandardThreadExecutor默认情况下并不做独立的配置,而是集成在了Connector容器内部实现。

 

8.  在完成了对所有容器的初始化操作之后,引导类Bootstrap调用start()方法开始引导Catalina进行启动。其过程同init过程,各个容器的主要作用就是调用其子容器的start方法完成启动。与init过程一样,基类LifecycleBase提供了对于生命周期修改的统一操作,而具体的启动操作由各个容器通过模板方法startInternal()方法实现。

 

二. Tomcata7默认的连接器启动过程,默认情况下采用了阻塞IO的JIoEndpoint来处理请求。


1.  Connector容器Service容器调用init()方法中调用模板方法initInternal()方法,并且调用Http11Protocol的init()执行初始化。

2.   这里Tomcat再次使用了模板与策略设计模式,Http11Protocol类的init方法由基类AbstractProtocol实现,主要完成了JMX的相关注册,之后开始调用核心类JIoEndpoint的初始化操作。

3.   JIoEndpoint类主要通过其内部方法bind(),通过工厂ServerSocketFactory准备好serverSocket对象,完成初始化操作。

4.   完成初始化后,Connector对象,调用Http11Protocol的start()方法。

5.   Http11Protocol调用JIoEndpoint类的start()方法启动Socket监听。

6.   JIoEndpoint类首先创建出一个接受线程,然后启动该接受线程开始监听Socket请求。至此Connetor启动完成。

 

三. 接下来继续看Tomcat的请求处理过程

1.  JIoEndpoint的Acceptor线程在接受到用户的请求之后,调用processSocket方法。该方法主要是从Executor线程池中获取一个线程,然后启用一个新线程执行Socket请求。实际上的处理过程要复杂的多,在多线程请求的情况下,需要考虑线程的死锁,处理请求过多时候的缓冲等内容。这里都不做说明,在后续章节详细说明。

 

2.  JIoEndpoint在调用Http11ConnectionHandler的process方法进行处理。

 

3.  Http11ConnectionHandler从缓冲池中取出Processor对象执行进行解析处理。

 

4.  Http11Processor类,将socket流解析生成Request对象与Response对象。其中Request对象只是解析Header部分内容,请求参数等做延迟处理,只有在Servlet需要的时候才执行解析操作。接着就开始调用CoyoteAdapter类处理Servlet。

 

5. CoyoteAdapter调用容器的管道一步一步的对Request,Response对象处理。Tomcat容器主要由4层组成,通过管道的模式将各个层的功能进行了独立,也有利于对各层插入需要的功能。如果需要,只要在server.xml中加入Value元素的配置即可完成扩展功能。

 

6.  StandardEngin容器默认管道StandardEnginValve。它主要做负责选择相应的host去处理请求。Tomcat可以有多个Host。

 

7.  StandardHost默认情况下配置了ErrorReportValve与StandardHostValue。ErrorReportValve用于处理错误日志。StandardHostValue则选择相应的Context容器,并且设定特定的类加载器,保证Context之间的安全性。

 

8.  StandardContext默认情况下配置了StandardContextValve。禁止对于WEB-INF与META-INF目录的访问控制,之后选择一个合适的Wrapper容器。

 

9.  StandardWrapper容器默认情况下配置了StandardWrapperValve。主要负责了两件事情。1)是启动过滤器FilterChain,对请求执行过滤操作。2)执行service方法。如果是Jsp内容则进行编译,然后执行。如果是静态文件直接取出内容返回,如果是servlet调用那么就调用servlet方法。补充说明,StandardWrapper容器是对于Servlet的包装,所有的Request的资源可以分成4种不同的类型,静态资源请求(HTML,图片,CSS等),JSP请求,Servlet请求,以及CGI请求。对于不同的请求Tomcat用WebdavServlet处理静态资源文件,JspServlet处理Jsp请求,CGIServlet处理CGI请求。

 

总结:本次主要说明了Tomcat的启动过程以及与请求处理过程,很多细节的内容并没有深入展开,细节将在后续章节进行进一步的说明。


推荐阅读
  • MySQL Administrator: 监控与管理工具
    本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文将探讨如何在 Struts2 中使用 ActionContext 和 ServletActionContext 来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。 ... [详细]
  • 本文详细探讨了Spring框架中遇到的NoSuchBeanDefinitionException异常,具体涉及com.thinkplatform.dao.UserLogDao Bean未定义的问题,并提供了相应的解决方案。 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
author-avatar
mobiledu2502853463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有