tomcat 中的 bootstrap 与 catalina
2015-10-31 19:36
351 查看
tomcat中各个组件的生命周期是由server控制的。那么server的生命周期由谁控制呢?
我们先来看下使用脚本启动tomcat的时候,首先会发生什么。
java应用要运行,需要一个main方法。tomcat启动的时候调用的是bootstrap中的main方法。
?
这个main方法首先会new一个Bootstrap对象,并且把这个对象放到一个static域中。
然后会对这个对象进行初始化,初始化方法如下:
?
在这个init方法中,会new一个catalina对象。bootstrap的大多数操作,诸如start、stop、load等,实际上都是调用的这个catalina对象的相应方法。
在bootstrap的初始化完成之后,会根据用户输入的main函数的参数(start、stop等),判断执行什么操作。
如果是start参数,就表明是启动tomcat。会先后执行daemon.setAwait、daemon.load、daemon.start这三个方法。他们最终会分别采用反射的方式去调用之前已经初始化的catalina的对应方法setAwait、load、start。也就是说其实bootstrap就调用了catalina的方法,本身是没做什么额外动作的。
stop则表明是关闭tomcat。
?
这里需要注意一点,我们使用脚本启动和关闭tomcat的时候,实际上最终都是执行bootstrap的main方法,正因为daemon是static的,所以,我们start和stop的时候,实际上操作的是同一个bootstrap对象,才能对同一个tomcat的启动和关闭。
如上面所说,在启动过程中,daemon.load会调用catalina的load方法。catalina的load方法如下:
?
这个方法实际上是在加载、解析server.xml,生成tomcat的组件:server、service、connector、engine、host、context等。最后调用server的init方法。
我们之前提到过tomcat中server用来管理整个tomcat的生命周期
daemon.load方法执行之后,会执行daemon.start,这个方法调用catalina的start方法,catalina调用server的start方法,从而启动tomcat的各个组件。
?
server start之后,catalina会创建一个 CatalinaShutdownHook 对象,然后将它添加到运行时的shutdownHook中。即注册一个虚拟机的shutdown hook,这样在我们不通过脚本关闭tomcat,而是直接杀死进程的时候,也能够执行catalina的stop方法,完成tomcat的关闭过程。
?
The Java virtual machine shuts down in response to two kinds of events:
1、程序正常退出,包括最后一个non-daemon线程退出或者Runtime.exit、System.exit方法被调用。
2、java虚拟机被终止,包括被用户中断,如:^C,或者系统级的事件:用户登出、系统关闭等。
发生上面的情况的时候,虚拟机就会调用所有的shutdown hook。
综上,tomcat启动过程实际就是bootstrap调用catalina的start方法,然后catalina调用server的start方法。关闭的时候,可以是bootstrap的stop方法调用catalina的stop方法,也可以是Hook调用catalina的stop方法,然后catalina的stop方法调用server的stop方法。
我们先来看下使用脚本启动tomcat的时候,首先会发生什么。
java应用要运行,需要一个main方法。tomcat启动的时候调用的是bootstrap中的main方法。
?
然后会对这个对象进行初始化,初始化方法如下:
?
在bootstrap的初始化完成之后,会根据用户输入的main函数的参数(start、stop等),判断执行什么操作。
如果是start参数,就表明是启动tomcat。会先后执行daemon.setAwait、daemon.load、daemon.start这三个方法。他们最终会分别采用反射的方式去调用之前已经初始化的catalina的对应方法setAwait、load、start。也就是说其实bootstrap就调用了catalina的方法,本身是没做什么额外动作的。
stop则表明是关闭tomcat。
?
如上面所说,在启动过程中,daemon.load会调用catalina的load方法。catalina的load方法如下:
?
我们之前提到过tomcat中server用来管理整个tomcat的生命周期
daemon.load方法执行之后,会执行daemon.start,这个方法调用catalina的start方法,catalina调用server的start方法,从而启动tomcat的各个组件。
?
?
1、程序正常退出,包括最后一个non-daemon线程退出或者Runtime.exit、System.exit方法被调用。
2、java虚拟机被终止,包括被用户中断,如:^C,或者系统级的事件:用户登出、系统关闭等。
发生上面的情况的时候,虚拟机就会调用所有的shutdown hook。
综上,tomcat启动过程实际就是bootstrap调用catalina的start方法,然后catalina调用server的start方法。关闭的时候,可以是bootstrap的stop方法调用catalina的stop方法,也可以是Hook调用catalina的stop方法,然后catalina的stop方法调用server的stop方法。
相关文章推荐
- Tomcat中对于post方法提交的表单采用的默认编码
- Centos 6.7 Tomcat基本安装测试
- Intellij idea13配置tomcat,并实现一个简单的servlet
- Centos 6.7 Tomcat Session集群
- 启动tomcat8提示内存泄漏问题解决
- Tomcat7 设置最大连接数
- Tomcat环境配置
- 在eclipse中配置tomcat,不用经常重启Tomcat
- 2015第44周六tomcat集群了解
- tomcat7配置
- 收集Tomcat异常日志并发送邮件
- 内存溢出之Tomcat内存配置
- Eclipse安装tomcat插件详解
- apache与tomcat实现动静分离--uriworkermap.propertie
- [细节]Tomcat对静态资源的缓存支持
- 内存溢出导致jenkins自动部署到tomcat失败
- 内存溢出导致jenkins自动部署到tomcat失败
- Zabbix通过JMX监控tomcat
- Tomcat shutdown无法结束进程的问题
- Tomcat的安装与第一个servlet程序的部署