Tomcat7源码分析
iteye_2159
这个作者很懒,什么都没留下…
展开
-
Tomcat7.0.42源代码运行环境搭建
以前看过Tomcat5的一部分源代码,当时只看了个大概的启动分析,后来看了《How Tomcat Works》这本书,讲的还行,出版的较早,所以是基于Tomcat4的代码的分析,Tomcat已经release到7了,很多后来添加的特性与新的实现方式那本书里面没有涉及。下半年业余时间的主要任务就是完成Tomcat7各个我感兴趣的点的系列文章。 先说下我的源码分析的环境搭建吧,用的是ecl...2013-07-11 13:13:05 · 176 阅读 · 0 评论 -
Tomcat7中一次请求处理的前世今生(四)Tomcat7阀机制原理
通过前面的三篇文章看到了一次客户端连接在Tomcat内部被转换成了请求对象(org.apache.catalina.connector.Request类的实例),并在该请求对象内部将与本次请求相关的Host、Context、Wrapper对象的引用。本文主要分析该请求对象在容器内部流转的经过。再来看一下Tomcat7内部的组件结构图:其实这张图已经给出了答案,在Connector接收到...2013-08-31 17:10:50 · 188 阅读 · 0 评论 -
Tomcat7中web应用加载原理(一)Context构建
为什么关心Tomcat中一个web应用的加载过程?在前面的文章中看过多次Tomcat的组件结构图,这里再贴出来回顾一下:之前的《Tomcat7启动分析》系列文章中看到Tomcat启动的时候将会解析server.xml,根据里面所配置的各个节点信息逐一初始化和启动相应组件(即分别调用它们的init和start方法),但浏览一下Tomcat7源码中的server.xml的内容,里面对应上图中的...2013-09-10 17:11:12 · 210 阅读 · 0 评论 -
Tomcat7中web应用加载原理(二)web.xml解析
前一篇文章讲了org.apache.catalina.startup.HostConfig的lifecycleEvent方法中所做的事情。最后看到在Tomcat启动时或启动后(后台线程定时扫描)会调用HostConfig类的deployApps方法: /** * Deploy applications for any directories or WAR files th...2013-09-19 08:44:06 · 277 阅读 · 0 评论 -
Tomcat7中web应用加载原理(三)Listener、Filter、Servlet的加载和调用
前一篇文章分析到了org.apache.catalina.deploy.WebXml类的configureContext方法,可以看到在这个方法中通过各种setXXX、addXXX方法的调用,使得每个应用中的web.xml文件的解析后将应用内部的表示Servlet、Listener、Filter的配置信息与表示一个web应用的Context对象关联起来。这里列出configureConte...2013-09-20 15:04:41 · 388 阅读 · 0 评论 -
Tomcat7自动加载类及检测文件变动原理
在一般的web应用开发里通常会使用开发工具(如Eclipse、IntelJ)集成tomcat,这样可以将web工程项目直接发布到tomcat中,然后一键启动。经常遇到的一种情况是直接修改一个类的源文件,此时开发工具会直接将编译后的class文件发布到tomcat的web工程里,但如果tomcat没有配置应用的自动加载功能的话,当前JVM中运行的class还是源文件修改之前编译好的class文件...2013-09-26 17:53:10 · 218 阅读 · 0 评论 -
Tomcat7中NIO处理分析(一)
Tomcat的Connector有三种运行模式bio、nio、apr,先了解一下这三种的区别。bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。一般而言,bio模式是三种运行模式中性能最低的一种。2.nio(new I/O),是Java ...2015-11-15 15:02:15 · 591 阅读 · 0 评论 -
Tomcat7中NIO处理分析(二)
6.PollerEvent处理流程Poller处理的核心是启动执行事件队列中的PollerEvent,接着从selector中遍历已经就绪的key,一旦发生了感兴趣的事件,则交由processSocket方法处理。PollerEvent的作用是向socket注册或更新感兴趣的事件: /** * * PollerEvent, cacheable obje...2015-11-15 15:50:40 · 189 阅读 · 0 评论 -
Tomcat7中的JMX使用(一)Standard MBean
做过Java平台下的应用服务器监控的对JMX应该不会陌生,简单说,JMX就是提供了一个标准的管理方案的框架。这里所说的管理的含义包括监控平台运行状况、应用级别配置资源、收集应用统计数据、调试、监视服务器性能,JMX 允许你将所有的资源(硬件和软件)打包成java 对象,然后将他们暴露在分布式环境中,并且JMX 提供了一个机制,可以很简单的将既存的管理协议,如SNMP ,映射到JMX 自己的管理...2014-05-10 13:41:51 · 178 阅读 · 0 评论 -
Tomcat7中一次请求处理的前世今生(三)请求与容器中具体组件的匹配
前一篇文章分析到了org.apache.coyote.http11.AbstractHttp11Processor类process方法,以解析请求头的getInputBuffer().parseRequestLine方法调用为例,看到如何从Socket的IO流中取出字节流数据,根据Http协议将字节流组装到Tomcat内部的org.apache.coyote.Request对象的相关属性中。...2013-08-30 15:34:08 · 240 阅读 · 0 评论 -
Tomcat7中一次请求处理的前世今生(二)Socket连接转换成内部请求对象
先抛开之前所看到的Tomcat源码不谈,Tomcat作为一个用Java实现的Web服务器,如果让你来实现,那么从何入手?这里首先需要厘清的是Web服务器的概念,谷歌了一下,发现这条解释还算靠谱点,【在网络环境下可以向发出请求的浏览器提供文档的程序】。这里面重点有两条,1.网络环境下,2.能够给出响应。用Java写过网络通信程序的都知道,这里必然会用到Socket编程。我们自己要实现的服务器...2013-08-28 20:09:45 · 251 阅读 · 0 评论 -
Tomcat7源码研究计划
Tomcat是个很大的项目,写个程序统计了一下java目录下的源文件1262个,总代码行数356163,要把这么多文件逐个研究一番确实需要很大的勇气。我的思路是挑选一些自己以前工作中会接触到的和个人比较感兴趣的点来研究,这样梳理起来算有点头绪,初步给自己的任务列出的是以下几点: 1.容器启动,从server到listener、jndi、service到connetor、engine到h...2013-07-12 15:57:11 · 152 阅读 · 0 评论 -
Tomcat7启动分析(一)启动脚本
在之前的环境搭建那篇文章里是通过直接运行BootStarp的main函数来启动的,只是加了一个catalina.home的系统属性。而正常情况下启动Tomcat是通过运行脚本的方式,这个就涉及到建立工程时拷贝过来的script目录下的一堆脚本文件了。以我的windows系统举例,实际上最终是执行startup.bat这个批处理文件来启动tomcat的。那么启动分析就冲这个文件开始吧:...2013-07-17 13:07:13 · 206 阅读 · 0 评论 -
Tomcat7启动分析(二)Bootstrap类中的main方法
之前分析了Tomcat的启动脚本,如果从startup.bat开始启动Tomcat的话会发现最后会调用org.apache.catalina.startup.Bootstrap里的main方法,并且传过来的最后一个命令行参数是start,接下来的启动代码分析就从这里开始。 先看下这个main方法的代码:/** * Main method and entry point ...2013-07-23 11:54:30 · 165 阅读 · 0 评论 -
Tomcat7启动分析(三)Digester的使用
前一篇文章里最后看到Bootstrap的main方法最后会调用org.apache.catalina.startup.Catalina对象的load和start两个方法,那么就来看看这两个方法里面到底做了些什么。 load方法: /** * Start a new server instance. */ public void load() ...2013-07-23 17:02:41 · 172 阅读 · 0 评论 -
Tomcat7启动分析(四)各组件init、start方法调用
在正常启动Tomcat7的情况下,上篇文章分析到了执行org.apache.catalina.core.StandardServer的init和start方法这儿,那么就来看看这两个方法里面到底干了些什么。但是在StandardServer类里面并没有发现这两个方法:由此推知这两方法必定是在该类的父类中已实现了,在StandardServer类的父类LifecycleMBeanBase...2013-08-05 17:38:28 · 298 阅读 · 0 评论 -
Tomcat7启动分析(五)Lifecycle机制和实现原理
在上篇文章分析Tomcat7的各组件的init、start方法时经常会看到有一个setStateInternal方法的调用,在查看LifecycleBase类及其它各组件的源码时会在多处看到这个方法的调用,这篇文章就来说说这方法,以及与这个方法相关的Tomcat的Lifecycle机制和实现原理。 上篇文章里谈到Tomcat7的各组件的父类LifecycleBase类,该类实现了接口o...2013-08-06 14:02:49 · 399 阅读 · 0 评论 -
Tomcat7服务器关闭原理
之前的几篇文章讲了Tomcat的启动过程,在默认的配置下启动完之后会看到后台实际上总共有6个线程在运行。即1个用户线程,剩下5个为守护线程(下图中的Daemon Thread)。如果你对什么叫守护线程的概念比较陌生,这里再重复一下:所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程。这种线程并不属于程序中不可或缺的部分,当所有的非守护线程结束时,程序也就终...2013-08-16 21:52:49 · 252 阅读 · 0 评论 -
Tomcat7中一次请求处理的前世今生(一)处理线程的产生
在默认的配置下Tomcat启动好之后会看到后台上总共有6个线程在运行。其中1个用户线程,剩下5个为守护线程(如下图所示)。如果你对用户线程、守护线程等概念不熟悉,请参看前一篇文章——Tomcat7服务器关闭原理。这里重点关注以http-bio-8080开头的两个守护线程(即http-bio-8080-Acceptor-0和http-bio-8080-AsyncTimeout),因为这是...2013-08-20 16:33:06 · 137 阅读 · 0 评论 -
Tomcat7中的JMX使用(二)Dynamic MBean
如上一篇文章所见Standard MBean在Tomcat的例子并不多,在jconsole中所看到的大量MBean(如Catalina下的Connector、Engine、Server、Service等),实际上是动态MBean(Dynamic MBean)。本文主要讲述Tomcat7中如何通过动态MBean的方式构造MBean的。 接触过动态MBean的朋友一定知道,它的实例肯...2014-05-12 08:48:23 · 215 阅读 · 0 评论