How tomcat works 读书笔记十七 启动tomcat 上

一路跋山涉水,这是最后一章了。

关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类。

理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了。

为了让用户更方便的启动tomcat,还有批处理文件startup.bat(终于见到最顶层的模块了!!)

Catalina

先说Catalina

它里面有一个Server组件(不懂的看第14章)。同时在它的start方法中包含一个Digester对象(不懂的看第15章)用来解析conf/下的Server.xml(这个xml装配起Catalina类里面的那个Server组件)。

同时Catalina本身也有main方法,在运行main方法的时候需要加上启动参数。可选start,stop,debug等等

我们看看process方法

    public void process(String args[]) {

        setCatalinaHome();     //设定Home与Base的值为user.dir
        setCatalinaBase();

    if (arguments(args))   //省略try catch
             execute();        //检查args的格式
    }
    protected void execute() throws Exception {
        if (starting)
            start();
        else if (stopping)
            stop();
    }

我们主要看如何启动。

  protected void start() { //省略了大量非核心代码 及try catch
    ...
        // Create and execute our Digester
        Digester digester = createStartDigester();  //这个要是不懂看15章
        File file = configFile();                   //指定文件为conf/server.xml
            InputSource is =new InputSource("file://" + file.getAbsolutePath());
            FileInputStream fis = new FileInputStream(file);
            is.setByteStream(fis);
            digester.push(this);        //把catalina自己放了进去
                    //catalina里有server组件
            digester.parse(is);
            fis.close();

    ...
        // Start the new server
        if (server instanceof Lifecycle) {
                server.initialize();
                // Wait for the server to be told to shut down
                server.await();  //上面的英文再给大家解释一下吧
                         //除非收到SHUTDOWM的指令 就一直阻塞在这里
                 //这要是不懂 回去看第二三章
        }
    ...
        // Shut down the server
        if (server instanceof Lifecycle) {
                ((Lifecycle) server).stop();
        }
    }

这里有一个问题

server.initialize();

server从哪里来的?

别急看createStartDigester方法。

 protected Digester createStartDigester() {

        // Initialize the digester
        Digester digester = new Digester();
        if (debug)
            digester.setDebug(999);
        digester.setValidating(false);

        // Configure the actions we will be using
        digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");
        digester.addSetProperties("Server");
    //解释一下下面
    //在解析server.xml时 如果碰到Server这个模式
    //就调用栈底元素的方法名为setServer参数为org.apache.catalina.Server的方法
    //把Server自己(就是上面addObjectCreate产生的那个)注入栈底的那个元素
    //那么栈底是什么呢?
    //digester.push(this); 看看这行代码还有Catalian的setServer方法
        digester.addSetNext("Server",
                            "setServer",
                            "org.apache.catalina.Server");

    .....
    return digester
}

Bootstrap类

现在说说Bootstrap

Bootstrap的main方法会实例化一个Catalina对象,并调用它的process方法。

在main方法中,首先会创建三个类加载器。

为什么?就是为了不让应用程序中的类使用WEB-INF/Class和WEB-INF/lib之外的类。

具体怎么做的看第八章。

  public static void main(String args[]) {// 省略非核心代码及try catch
        // Construct the class loaders we will need
        ClassLoader commonLoader = null;
        ClassLoader catalinaLoader = null;
        ClassLoader sharedLoader = null;
      ...

            // Load our startup class and call its process() method
            // Instantiate a startup class instance
            if (debug >= 1)
                log("Loading startup class");
            Class startupClass =
                catalinaLoader.loadClass
                ("org.apache.catalina.startup.Catalina");
            Object startupInstance = startupClass.newInstance(); //加载Catalina类

            // Call the process() method
            if (debug >= 1)
                log("Calling startup class process() method");
            methodName = "process";
            paramTypes = new Class[1];
            paramTypes[0] = args.getClass();
            paramValues = new Object[1];
            paramValues[0] = args;
            method =
                startupInstance.getClass().getMethod(methodName, paramTypes);
            method.invoke(startupInstance, paramValues);  //调用Catalina的process方法
    }

关于startup.bat的知识,我们下一节再谈... 哎还有一节呀

时间: 2024-12-26 21:42:29

How tomcat works 读书笔记十七 启动tomcat 上的相关文章

How tomcat works 读书笔记十七 启动tomcat 下

在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释,解释器不会执行rem开始的命令 2 pause 用于暂停正在执行的批处理文件,按任意键后继续 3 echo 在控制台显示一段文本 如果显示变量的值需要在变量前后加% 如echo %var% 如果要输出操作系统的名字 就是 echo %os% 4 echo off 可以将命令本身隐藏 如果要连ech

How tomcat works 读书笔记十二 StandardContext 上

在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个invoke. 两个变量 这里首先咱们得说两个boolean型的变量available,configured. 先说available,它表示了StandardContext是否可用,初始值为false.若StandardContext启动成功,其值就变为true;另外各种原因都会导致StandardC

how tomcat works 读书笔记(二)----------一个简单的servlet容器

app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/article/details/39378157) 回顾我们上一章,我们开发了一个最最简单的web服务器,它可以使用户访问服务器内的静态资源.当然这是远远不够的,在这一节里,我们就试着让服务器在能相应静态资源的基础上继续支持servlet. servlet接口 javax.servlet.Servlet接口

how tomcat works 读书笔记四 tomcat的默认连接器

其实在第三章,就已经有了连接器的样子了,不过那只是一个学习工具,在这一章我们会开始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足以下几个要求 1 实现org.apache.cataline.Connector接口 2 负责创建实现了org.apache.cataline.Request接口的request对象 3 负责创建实现了org.apache.cataline.Response接口的response对象 这里默认的连接器的原理很简单,就是等待http请求,创建re

how tomcat works读书笔记 七 日志记录器

大家能够松一口气了,这个组件比較简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. package org.apache.catalina; import java.beans.PropertyChangeListener; public interface Logger { public static final int FATAL = Integer.MIN_VALUE; public s

how tomcat works 读书笔记(一)----------一个简单的web服务器

http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext transfer protocol). http分两部分,一个是请求(客户端发给服务器),一个是回复(服务器发给客户端). 先看http请求 下面就是一个http请求的例子,其中的各项参数,请查阅相关资料.(http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/

How tomcat works 读书笔记十五 Digester库 下

在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的configured变量置为true.在这里我们看看完整版的ContextConfig都干了什么. 在tomcat的实际部署中,StandContext类的实际监听器是org.apache.catalina.startup.ContextConfig的实例. ContextConfig完成加载验证器阀,

How tomcat works 读书笔记十四 服务器组件和服务组件

之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apache.catalina.Server接口的实例用来表示Catalina的整个servlet引擎. 我们使用Server就是因为,它用一种优雅的方式来启动/关闭整个系统. 下面是启动和停止机制是如何工作的.当服务器启动的时候,它启动它内部的所有组件.然后无限期的等待关闭命令,如果你想要关闭系统,发送

How Tomcat Works 读书笔记 八 载入器

Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf123321/article/details/40431297 首先说明两个术语 仓库(repository),表示类加载器会在哪里搜索要载入的类; 资源(resource),知道一个类载入器中的DirContext对象,它的文件跟路径指的就是上下文的文件跟路径. 在tomcat中,我们使用了自定义载入器,