首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

一、Tomcat启动

2012-12-27 
1、Tomcat启动[转]http://dev.csdn.net/htmls/27/27225.html?1.入口类及main方法tomcat的入口类是org.apach

1、Tomcat启动

[转]http://dev.csdn.net/htmls/27/27225.html

?

1.入口类及main方法

tomcat的入口类是org.apache.catalina.startup.BootStrap,进入其main方法,可以看到它首先实例化,然后进行初始化。

?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动?一、Tomcat启动

?实例化是通过Digester类完成,它可以实现xml与javaBean之间的转化,想了解的可以参考这里

http://software.ccidnet.com/art/322/20021125/31671_2.html

最后调用server的start方法启动tomcat

?一、Tomcat启动

??????? try {
??????????? // Register shutdown hook
??????????? if (useShutdownHook) {
??????????????? if (shutdownHook == null) {
??????????????????? shutdownHook = new CatalinaShutdownHook();
??????????????? }
??????????????? Runtime.getRuntime().addShutdownHook(shutdownHook);
??????????? }
??????? } catch (Throwable t) {
??????????? // This will fail on JDK 1.2. Ignoring, as Tomcat can run
??????????? // fine without the shutdown hook.
??????? }

??????? if (await) {
??????????? await();
??????????? stop();
??????? }

??? }

Shutdownhook是一个Thread对象,用于给JVM在收到停止命令时(例如Ctrl C),运行这些Thread执行收尾工作,具体用法可以参考JAVA文档

CatalinaShutdownHook在这里就是执行Catalina.stop方法,所以在Catalina.stop方法里面,会手动删除Runtime中的CatalinaShutdownHook,以防止调用两次stop,如下:

// Remove the ShutdownHook first so that server.stop()
??????????? // doesn't get invoked twice
??????????? if (useShutdownHook) {
??????????????? Runtime.getRuntime().removeShutdownHook(shutdownHook);
??????????? }

?

Catalina也有个main函数,不过里头调用的方法都是已废弃的,估计是遗留代码

main函数主要是对命令行参数进行解析,比如可以取代默认的server.xml路径,其余工作主要交给load和start方法

load方法
按以下顺序读取配置文件server.xml,通过Digester类进行解析
1.configFile字段指明的配置文件“conf/server.xml”
2.Catalina的类装载器的getResource方法(具体原理不清楚,似乎很神奇。和装载类的机制一样,propagate方式,父装载器优先)
3.最后是从内置的catalina.jar的server-embed.xml读入配置

一旦读取成功,则后面的不读取,优先级依次降低
load方法最后进行配置和server的初始化,调用server.initialize方法

其中,Digester类似乎很神奇很强大,可以根据一定的规则,对一个xml源文件进行解析,然后执行相应的动作,留待以后研究。这里有一篇文章可以参考

http://software.ccidnet.com/pub/article/c322_a31671_p2.html

?

stop方法

// Shut down the server
??????? if (server instanceof Lifecycle) {
??????????? try {
?????????????? ((Lifecycle) server).stop();
??????????? } catch (LifecycleException e) {
??????????????? log.error("Catalina.stop", e);
??????????? }
??????? }

stopserver方法
比起stop方法要复杂得多,不是简单地调用server.stop,而是通过创建一个Digester,根据配置文件的定义进行动作;然后,以非常“原始”的方法:建立到server的socket连接,以字节流的方式,一个个字符地发送tomcat的“SHUTDOWN”指令,如下:

// Stop the existing server
?????? try {
?????????? String hostAddress = InetAddress.getByName("localhost").getHostAddress();
?????????? Socket socket = new Socket(hostAddress, server.getPort());
?????????? OutputStream stream = socket.getOutputStream();
?????????? String shutdown = server.getShutdown();
?????????? for (int i = 0; i < shutdown.length(); i++)
?????????????? stream.write(shutdown.charAt(i));
?????????? stream.flush();
?????????? stream.close();
?????????? socket.close();
?????? } catch (IOException e) {
?????????? log.error("Catalina.stop: ", e);
?????????? System.exit(1);
?????? }

?

补充
在看完StandardServer后,回到Catalina,现在对于Catalina的stop和stopServer方法的区别又多了一些理解。

关于StandardServer的笔记:

Catalina的stop方法,其实是调用StandardServer.stop,进而停止StandardServer内部的各个Service,是名副其实的真正“停止”服务器

而stopServer方法,其实是构造一个socket连接到StandardServer的await方法打开的端口上,并发送SHUTDOWN命令。如前面所述,await只是起到阻塞作用,接受到SHUTDOWN命令后则await结束阻塞,并返回。具体要做哪些操作,还得由调用await的代码来决定。

现在先姑且认为,Catalina的stop方法是单纯的、Catalinal自己定义的一个停止服务器的函数,里面的实现都是封装在Catalina内部的,完成的工作就是停止服务器的socket和相关的Service服务,外人无法改动。

假如有第三方希望在停止server之前做点别的事情(比如释放特定的资源、或者通知其他组件),那么可以利用stopServer方法,待到await返回后,先完成自己要做的事情,最后再回头调用Catalina.stop(),完成最终的“停止” 。

通过这样的设计,tomcat给了外部代码,或者说基于tomcat的二次开发人员很大的灵活性,不必拘泥于tomcat本身的实现,也有利于tomcat自身的功能扩展。

?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangchengsi/archive/2008/09/20/2966850.aspx

热点排行