tomcat是现在部署java网络工程用的最多的web容器,它帮我们实现了网络请求的监听,各个服务线程的启动,帮助我们管理项目中的各个server脚本。
本文从Bootstrap类中的main函数开始一步步解析tomcat源码中的各个流程。我看的是tomcat-8.5.24的版本,如果有什么谬误的地方也欢迎讨论。
tomcat生命周期管理,pipeline的流动。四大容器类StandardEngine,StandardHost,StandardContext及StandardWrapper都有各自缺省的标准valve实现,可以参考如下文章http://gearever.iteye.com/blog/1536022
后台线程的定义是:在程序结束时,即使线程还在运行但不会阻止JVM退出。一个后台线程的例子就是JVM的垃圾回收线程。将线程设置为后台线程只需要调用thread.setDaemon(true);参考: http://www.importnew.com/6255.html
bootstrap类,如它的字面意思是一个引导类,引导加载类文件,启动tomcat web容器
我们知道java工程,找到main函数就好像找到了线头一样,那么tomcat的线头就在bootstrap类里面main函数如下
可以看出这个函数主要做了几件事情:
bootstrap初始化
将bootstarp设置入daemon
读取最后一个入参指令
startd:加载参数,启动容器
stopd:调用catalina的stop方法的关闭并销毁容器
start:设置等待状态为true(这个后续会挂起等待后续命令),加载参数,启动容器
stop:调用catalina的stopServer方法关闭容器 该方法会先判断是否存在一个server实例,存在就调用实例stop掉,不存在会创建并执行解析器,然后再次获取server向server发送SHUTDWON的指令(这一块不是非常理解,欢迎探讨)
bootstrap初始化
主要做了几件事情
初始化类加载器
设置catalinaLoader进主线程的ContextClassLoader(用于加载webApp下的类)
SecurityManager加载jar包的类
加载启动类org.apache.catalina.startup.Catalina
通过反射获取Catalina的接口里的setParentClassLoader,并且执行放入sharedLoader
将catalinaDaemon设为Catalina
其中初始化类加载器主要做了两件事情:
1、从CatalinaProperties获取jar包路径
2、依据Catalina目录jar包路径,分别依次解析commonLoader,catalinaLoader,sharedLoader