Tomcat启动分析
2016-01-09 22:46
513 查看
tomcat在启动时的重点功能如下:
初始化类加载器:主要初始化CommonLoader、CatalinaLoader以及SharedLoader;
解析配置文件:使用Digester组件解析Tomcat的server.xml,初始化各个组件(包含各个web应用,解析对应的web.xml进行初始化);
初始化连接器:初始化声明的Connector,以指定的协议打开端口,等待请求。
不管是通过命令行启动还是通过Eclipse的WST server UI,Tomcat的启动流程是在org.apache.catalina.startup. Bootstrap类的main方法中开始的,在启动时,这个类的核心代码如下所示:
?
从以上的代码中,可以看到在Tomcat启动的时候,执行了三个关键方法即init、load、和start。后面的两个方法都是通过反射调用org.apache.catalina.startup.Catalina的同名方法完成的,所以后面在介绍时将会直接转到Catalina的同名方法。首先分析一下Bootstrap的init方法,在该方法中将会初始化一些全局的系统属性、初始化类加载器、通过反射得到Catalina实例,在这里我们重点看一下初始化类加载器的方法:
?
在以上的代码总,我们可以看到初始化了三个类加载器,这三个类加载器将会有篇博文进行简单的介绍。
然后我们进入Catalina的load方法:
?
在以上的代码中,关键的任务有两项即使用Digester组件按照给定的规则解析server.xml、调用Server的initialize方法。关于Digester组件的使用,后续会有一篇专门的博文进行讲解,而Server的initialize方法中,会发布事件并调用各个Service的initialize方法,从而级联完成各个组件的初始化。每个组件的初始化都是比较有意思的,但是我们限于篇幅先关注Connector的初始化,这可能是最值得关注的。
Connector的initialize方法,核心代码如下:
?
在Http11Protocol的init方法中,核心代码如下:
?
我们看到最终的初始化方法最终都会调到JIoEndpoint的init方法,网络初始化和对请求的最初处理都是通过该类及其内部类完成的,所以后续的内容将会重点关注此类:
?
在上面的代码中,我们可以看到此时初始化了一个ServerSocket对象,用来准备接受请求。
如果将其比作赛跑,此时已经到了“各就各位”状态,就等最终的那声“发令枪”了,而Catalina的start方法就是“发令枪”啦:
?
此时会调用Server的start方法,这里我们重点还是关注JIoEndpoint的start方法:
?
从以上的代码,可以看到,如果没有在server.xml中声明Executor的话,将会使用内部的一个容量为200的线程池用来后续的请求处理。并且按照参数acceptorThreadCount的设置,初始化线程来接受请求。而Acceptor是真正的幕后英雄,接受请求并分派给处理过程:
?
从这里我们可以看到,Acceptor接受Socket请求,并调用processSocket方法来进行请求的处理。至此,Tomcat的组件整装待命,等待请求的到来。关于请求的处理,会在下篇文章中介绍。
初始化类加载器:主要初始化CommonLoader、CatalinaLoader以及SharedLoader;
解析配置文件:使用Digester组件解析Tomcat的server.xml,初始化各个组件(包含各个web应用,解析对应的web.xml进行初始化);
初始化连接器:初始化声明的Connector,以指定的协议打开端口,等待请求。
不管是通过命令行启动还是通过Eclipse的WST server UI,Tomcat的启动流程是在org.apache.catalina.startup. Bootstrap类的main方法中开始的,在启动时,这个类的核心代码如下所示:
?
?
然后我们进入Catalina的load方法:
?
Connector的initialize方法,核心代码如下:
?
?
?
如果将其比作赛跑,此时已经到了“各就各位”状态,就等最终的那声“发令枪”了,而Catalina的start方法就是“发令枪”啦:
?
?
?
相关文章推荐
- Tomcat配置常见错误以及解决方案
- eclipse中tomcat能正常启动,但是浏览器访问不了tomcat首页 问题解决
- tomcat源码阅读(一)——环境搭建
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理
- Tomcat启动过程原理详解
- linux 下安装tomcat
- 转 Eclipse中启动tomcat 浏览器无法访问8080端口
- Tomcat源码阅读之Server.xml文件的处理与Catalina启动流程
- Eclipse下使用Tomcat插件打包war文件的详细过程
- tomcat jvm调优
- LINUX TOMCAT 部署 两个项目 出现Choose unique values for the 'webAppRootKey' context-param in your web.xml
- eclipse插件maven的使用,web打包成WAR,tomcat下直接运行
- 在ECLIPSE中用MAVEN和TOMCAT来建立WEBAPP
- 同一个project,tomcat启动没问题, jetty启动报错 invalid entry size
- 记一次tomcat故障排查(转)
- tomcat配置路径
- linux服务自动手动启动tomcat的方式
- 【Linux运维-集群技术进阶】Nginx+Tomcat实现Web服务器的负载均衡
- 连接本地服务器Tomcat上解析Json的一个新闻客户端界面
- Tomcat7.0.26的连接数控制bug的问题排查