Tomcat7源码资料.docVIP

  • 1
  • 0
  • 约9.79千字
  • 约 33页
  • 2017-08-15 发布于湖北
  • 举报
目 录 一、背景 2 二、Tomcat源码目录结构 3 三、Tomcat体系结构 4 四、Tomcat源码解析 5 1. Tomcat的启动流程?? 7 2. Tomcat一次完整请求的处理流程 12 3. Tomcat的关闭流程 18 4. Tomcat的Connector组件 18 5. Tomcat运行过程中的线程概况及线程模型 20 6. Tomcat的类加载机制 25 7、Tomcat所涉及的设计模式 32 一、背景 ?? 二、Tomcat源码目录结构 三、Tomcat体系结构 四、Tomcat源码解析 ? Servlet规范和Web应用及Web容器间的关系 ? ? ?? Tomcat对Servlet规范的实现 1. Tomcat的启动流程?? ? ? ?? 从以上的代码中,可以看到在Tomcat启动的时候,执行了三个关键方法即init、load、和start。后面的两个方法都是通过反射调用org.apache.catalina.startup.Catalina的同名方法完成的,所以后面在介绍时将会直接转到Catalina的同名方法。首先分析一下Bootstrap的init方法,在该方法中将会初始化一些全局的系统属性、初始化类加载器、通过反射得到Catalina实例,在这里我们重点看一下初始化类加载器的initClassLoaders()方法: ? 在以上的代码中,我们可以看到初始化了StandardClassLoader类加载器,这个类加载器详细的会在后面关于Tomcat类加载器机制中介绍。 然后我们进入Catalina的load方法: 在以上的代码中,关键的任务有两项即使用Digester组件按照给定的规则解析server.xml、调用Server的init方法,而Server的init方法中,会发布事件并调用各个Service的init方法,从而级联完成各个组件的初始化。每个组件的初始化都是比较有意思的,但是我们限于篇幅先关注Tomcat各级容器的初始化及Connector的初始化,这可能是最值得关注的地方。 首先看下StandardService的startInternal方法, 核心代码如下: 启动Tomcat各级容器会依次先启动StandardEngine -- StandardHost -- StandardContext(代表一个WebApp应用),因为我们比较关心我们的Web应用是在哪里被初始化回调的,所以重点看下StandardContext的startInternal()方法,核心代码如下: Tomcat的各级容器初始化完成后,就开始对Connector的初始化,接着看Connector的initInternal方法,核心代码如下: 在Http11Protocol的init方法中,核心代码如下: 我们看到最终的初始化方法都会调到JIoEndpoint的bind方法,网络初始化和对请求的最初处理都是通过该类及其内部类完成的,后续的内容会详细阐述这个JioEndpoint: 在上面的代码中,我们可以看到此时初始化了一个ServerSocket对象,用来监听绑定端口的请求。 紧接着我们来看看JioEndpoint的start()方法,核心代码如下: 从以上的代码,可以看到,如果没有在server.xml中声明Executor的话,将会使用内部的一个容量为200的线程池用来后续的请求处理。并且按照参数acceptorThreadCount的设置,初始化线程来接受请求。而Acceptor就是正在接受请求并会分派给请求处理线程池: 从这里我们可以看到,Acceptor已经可以接收Socket请求了,并可以调用processSocket方法来对请求进行处理。至此,Tomcat的组件启动初始化完成,等待请求的到来。 ?2. Tomcat一次完整请求的处理流程 接着请求处理线程池会起一个线程来处理请求来执行SocketProcessor,而SocketProcessor的run()方法中会调用Http11ConnectionHandler的process方法,SocketProcessor的run()方法核心代码如下: 在Http11ConnectionHandler中会根据当前请求的协议类型去创建相应的协议处理器,我们这里分析的是HTTP协议,所以会创建Http11Processor去执行process()方法,拿到Socket数据包后解析生成Tomcat内部的Request对象与Response对象。其中Request对象只是解析Header部分内容,请求参数等做延迟处理,接着就开始调用CoyoteAdapter类进入容器处理,Http11Processor的process方法核心代码如下: ? 紧接着C

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档