`

Tomcat 源码分析[1]

阅读更多
水平有限,如有不足请留言交流,互相提高,谢谢!转载请提供出处,http://treblesoftware.iteye.com/admin/blogs/515042



引用
TOMCAT作为世界上使用较为广泛的SERVLET容器被许多项目所应用。是很值得学习的。


首先,我们先要下载TOMCAT的源码,包括要引入TOMCAT的几个依赖包。

1,到 http://tomcat.apache.org/download-60.cgi 下载 Source Code,我下载的是TOMCAT 6.X 版,可以到这里直接下载:http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-6/v6.0.20/src/apache-tomcat-6.0.20-src.tar.gz

2,下载这几个依赖包:org.eclipse.jdt.core.jar (这里可以到ECLIPES架包里找到);wsdl4j.jar;jaxrpc.jar;junit-4.6.jar;ant.jar 。

OK,新建一个JAVA项目,之后把解压好的tomcat源码放入新建项目中,再把依赖包buildpath一下就可以了。



确保此项目可以正确被构建。

我们首先从 org.apache.catalina.startup; 包中的 Bootstrap 类开始。这个类中拥有一个

MAIN函数入口,我们可以把此入口当作TOMCAT的程序入口,并且在这个类里拥有initClassLoaders,createClassLoader,init,load,start,stop,stopServer,destroy这些方法。

下面是一些源码:
/**
     * Start the Catalina daemon.
     */
    public void start()
        throws Exception {
        if( catalinaDaemon==null ) init();

        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
        method.invoke(catalinaDaemon, (Object [])null);

    }


 /**
     * Stop the Catalina Daemon.
     */
    public void stop()
        throws Exception {

        Method method = catalinaDaemon.getClass().getMethod("stop", (Class [] ) null);
        method.invoke(catalinaDaemon, (Object [] ) null);

    }


/**
     * Stop the standlone server.
     */
    public void stopServer()
        throws Exception {

        Method method = 
            catalinaDaemon.getClass().getMethod("stopServer", (Class []) null);
        method.invoke(catalinaDaemon, (Object []) null);

    }



 /**
     * Main method, used for testing only.
     *
     * @param args Command line arguments to be processed
     */
    public static void main(String args[]) {

        if (daemon == null) {
            daemon = new Bootstrap();
            try {
                daemon.init();
            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }

        try {
            String command = "start";
            if (args.length > 0) {
                command = args[args.length - 1];
            }

            if (command.equals("startd")) {
                args[0] = "start";
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stopd")) {
                args[0] = "stop";
                daemon.stop();
            } else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stop")) {
                daemon.stopServer(args);
            } else {
                log.warn("Bootstrap: command \"" + command + "\" does not exist.");
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }

    }


开始发现一点,反射被大量使用了。首先,这里应该不应该使用反射,我想大家意见不一,不过报着学习源码的态度,我们略过,因为我是设置断点进行调试学习的,所以可以更容易跟踪程序的运行步骤。



首先,我们先看看这个Bootstrap类的设计。

public final class Bootstrap {

    private static Bootstrap daemon = null;

     public static void main(String args[]) {

        if (daemon == null) {
            daemon = new Bootstrap();
            try {
                daemon.init();
            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }
 …… …… ……


引用

首先可以看出,daemon做为启动TOMCAT的唯一对象,被设计成了单列。在我认为,daemon 本身就应该为单列对象,它控制着TOMCAT的初始化,本身就应该唯一存在,如果多个daemon 必然导致数据与操控上的问题


除了使用了单列模式,这个类中还使用了类似于Template方法模式,这个应该算是一个简单的Template Method,记得MARTIN FOWLER在《重构》中也有把沉长的代码分解为一个一个算法,之后拼装在一起。在下面这个方法中体现的很好。

public void init()
        throws Exception
    {

        // Set Catalina path
        setCatalinaHome();
        setCatalinaBase();

        initClassLoaders();

   …… …… ……


看完了设计,下面我们先搞清楚UML图里的一些属性,它到底是干什么用的,包括深入这几个方法,看看它们是怎么初始化的,关闭的。




  • 大小: 19.9 KB
  • 大小: 56.8 KB
分享到:
评论

相关推荐

    Tomcat源码分析1

    《Tomcat源码分析1——服务启动与架构详解》 Tomcat,作为一款广泛应用的开源Java Servlet容器,其内部架构和启动流程对于深入理解和优化Web应用程序至关重要。本文将重点解析Tomcat启动时的关键步骤和核心组件,...

    tomcat源码分析1

    《深入理解Tomcat源码分析1:Connector配置详解》 Tomcat,作为广泛使用的Java Servlet容器,其核心组件之一就是Connector,它负责处理Web服务器与客户端之间的通信。本篇文章将详细探讨Tomcat Connector的种类、...

    tomcat 源码分析系列文档

    【标签】"tomcat源码分析"表明整个资料集专注于Tomcat的源代码级探索,适合于开发者或运维人员深入了解服务器的底层实现。 【文件名称列表】中的每个文档都对应一个特定主题: 1. "Tomcat处理HTTP请求源码分析.doc...

    tomcat源码基于6.0

    二、Tomcat源码分析 1. **启动流程**:从`bin/catalina.sh`或`bin/catalina.bat`开始,通过`org.apache.catalina.startup.Bootstrap`启动Catalina,加载配置文件,初始化服务器,最后启动主循环监听端口。 2. **...

    tomcat6源码分析

    《Tomcat6源码分析——深入理解Web服务器的运行机制》 Tomcat6作为Apache软件基金会的Jakarta项目的一部分,是一款广泛使用的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为开发和部署...

    tomcat架构的源码分析

    ### Tomcat架构的源码分析 #### 一、Tomcat的架构概述 Tomcat作为一款广泛使用的开源Java Servlet容器,其内部架构设计简洁而高效。本文档将对Tomcat的架构进行详细介绍,并从源码层面深入分析其核心组成部分。...

    「Tomcat源码剖析」.pdf

    Tomcat源码剖析 : 整体架构 层层分析 源码解析 架构分析 (Http服务器功能:Socket通信(TCP/IP)、解析Http报文 Servlet容器功能:有很多Servlet(自带系统级Servlet+自定义Servlet),Servlet处理具体的业务逻辑...

    TOMCAT源码分析(启动框架)

    【TOMCAT源码分析(启动框架)】 Tomcat是一款广泛应用的开源Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Web应用程序提供了运行环境。本篇文章将深入探讨Tomcat的系统框架及其启动流程...

    tomcat源码分析图谱

    tomcat的基础脚本分析 tomcat的源码启动分析 tomcat的web应用启动分析 tomcat的socket分析 tomcat的cocket与容器对接时序分析

    tomcat源码

    Apache Tomcat源码分析 Apache Tomcat是一款广泛应用的开源Java Servlet容器,它是Java EE Web应用程序的标准实现。Tomcat源码的深入理解对于Java Web开发者来说是至关重要的,它可以帮助我们了解HTTP服务器的工作...

    Tomcat源码分析

    【标题】"Tomcat源码分析" 在深入探讨Tomcat源码之前,首先需要了解Tomcat是什么。Tomcat是一款开源的、基于Java的Web应用服务器,由Apache软件基金会开发。它实现了Java Servlet和JavaServer Pages(JSP)规范,...

    tomcat 最全源码分析

    对 NIO 模式,请求的流程描述的很详细。值得去仔细的研究。

    Tomcat源码Tomcat源码

    【Tomcat源码分析】 Tomcat作为一款广泛应用的开源Java Servlet容器,它的源码解析对于深入理解Web服务器的工作原理和优化应用性能至关重要。本文将主要探讨Tomcat的启动框架、核心组件及其相互关系。 首先,...

    tomcat8源码

    Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是开发和部署Java Web应用的重要平台。深入理解Tomcat的源码有助...

    tomcat源码依赖包

    《深入理解Tomcat源码:必备依赖包解析》 Tomcat作为一款广泛应用的开源Java Servlet容器,其源码的编译与理解对于开发者来说具有重要的价值。为了能够顺利地编译Tomcat源码,了解并掌握相关的依赖包是至关重要的。...

Global site tag (gtag.js) - Google Analytics