tomcat启动过程(一)

来源:互联网 发布:java菜单权限 编辑:程序博客网 时间:2024/06/05 22:52
 

            最近在做网站的时候,发现tomcat服务器在接受到请求后不应答。在网上搜了一下,网上说法五花八门,于是决定看一下tomcat的源码(呵呵……,本人时间还是挺多的。),想从底层了解一下服务器的实现机制,解决遇到的问题,同时也可以学到大师们的编程艺术,一举多得哈。以下是我在学习tomcat时的一点感受(可能会有错误)。

  首先,我觉得有必要了解一下tomcat的体系结构,关于tomcat体系结构方面的资料还是挺多的,我觉得http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/这篇文章不错,我看了之后,有种茅塞顿开的感觉。

  然后参考http://www.haogongju.net/art/105048这个网页下载tomcat源码,并进行相应的配置。(在这里有一个需要注意的地方,在将tomcat的源码导入到myeclipse中后,可能需要手工添加JRE System Library[Sun JDK])

  现在进入代码分析阶段;

  tomcat的主函数在org.apache.catalina.startup包的Catalina类中。Catalina类的主函数可以接受字符串参数“start" 或者"stop"("start" 表示启动tomcat,而"stop"表示停止tomcat。可能还有其他参数)。main 函数调用process函数。

       process根据参数值选择操作,如果是"start",启动tomcat服务器。process通过调用load 函数 和start函数来完成整个服务器启动过程。

      load函数根据conf/server.xml文件实例化类。在load函数中,使用Digester类解析server.xml文件并实例化server和service以及Connector等。

      start函数启动server和service类。start函数主要通过调用service的start方法来实现此功能。

---------------------

Load函数使用Digester解析Xml文档。Digester使用SAX方法解析Xml文档。

具体过程如下:

       load调用createStartDigester 函数返回一个Digester类的实例digester.然后使用digester.parse(inputSource);解析xml文档

     createStartDigester函数在返回Digester类的实例digester的同时,对digester的属性rules进行了初始化,将tomcat中涉及到的类以及名称关系存储在digester.rules中,如下代码将"Server"与"org.apache.catalina.core.StandardServer"相关联。

        digester.addObjectCreate("Server",

                                 "org.apache.catalina.core.StandardServer",

                                 "className");

     

代码片断1

   digester.parse(inputSource)调用digester的getXMLReader()方法得到一个xmlReader类型reader,然后通过reader.parse()解析xml文档。digester的getXMLReader()方法在返回reader之前,对reader的事件处理器进行注册。reader.parse()解析xml文档时如果发生事件就会调用事件处理器的相应方法进行处理。

 

例如遇到节点

- <Server port="8005" shutdown="SHUTDOWN">

则调用digester.startElement方法以及digester.endElement方法。digester.startElement会根据节点名称“Server” 在digester.rules查找相关“纪录”,由代码片断1可知,查找的结果为"org.apache.catalina.core.StandardServer", 这样就可以动态加载服务类"org.apache.catalina.core.StandardServer"了。(加载类最终通过digester.getClassLoader().loadClass(realClassName).newInstance()实现。在这里只是简单说明,事实上,这里加载类是一个很复杂的过程,)

 

原创粉丝点击