`
thinkerAndThinker
  • 浏览: 282850 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat原理:启动过程分析

 
阅读更多
从开始学Java,使用网页编程,我们的程序就一直在web容器内运行。容器的概念也是彷佛距离我们相当遥远。Spring给了我们一扇窗户,让我们理解轻量级容器的解决方案。非常庆幸我们所处在一个开源的Java世界,所有的优秀软件都可以在代码级进行亲密接触。
Tomcat结构写的相当之好,极易阅读。本系列文档计划着重以下3个方面:
1. Tomcat 启动过程分析。分析tomcat的启动过程
2. Tomcat Web容器功能分析。分析web容器的实现方法
3. Tomcat 其他配置说明。一些我们目前应用较少的Tomcat配置项说明
注意,本文档分析基于Tomcat5.028完成。
Tomcat的启动过程简单说起来,就是读取配置文件server.xml,然后对其进行实例化的过程。
1. 启动命令行参数
命令行方式下,直接启动startup.bat/.sh即可。bat文件目的就在于获得启动参数。一般情况下,使用类似如下所示的启动方法。注意:bootstrap.jar文件中,还指定了3个包在classpath中。
java -classpath "d:\tools\jdk1.5.0\lib\tools.jar;D:\Tomcat-5.0.28\bin\bootstrap.jar" -Dcatalina.base="D:\Tomcat-5.0.28" -Dcatalina.home="D:\Tomcat-5.0.28" -Djava.io.tmpdir="D:\Tomcat-5.0.28\temp" org.apache.catalina.startup.Bootstrap start
Bootstrap是Tomcat的入口。比如启动、关闭、重启都是通过这个类实现对tomcat的控制。

2. ClassLoader的使用
Tomcat对不同的模块可能使用不同的ClassLoader加载。这也就是为什么很多类不在启动的classpath中,却可以被它调用的原因。
下面是Bootstrap初始化ClassLoader的方法:
private void initClassLoaders() {
    try {
        ClassLoaderFactory.setDebug(debug);
        commonLoader = createClassLoader("common", null);
        catalinaLoader = createClassLoader("server", commonLoader);
        sharedLoader = createClassLoader("shared", commonLoader);
    } catch (Throwable t) {
        log("Class loader creation threw exception", t);
        System.exit(1);
    }
}

下图是Tomcat用户手册上看到的。
       Bootstrap
          |
       System
          |
       Common
      /      \
Catalina   Shared
(server)     /   \
      Webapp1 Webapp2 ...
Bootstrap是JVM提供的
System是在classpath中提供的
Common包含配置文件/org/apache/catalina/startup/catalina.properties中指定的类库支持
Catalina和Shared都从Common中继承,包含的类库也在上面配置文件中指定。
WebappX在部署单个Tomcat5实例时指定。一个webapp下面的类库对另外一个是不可见的
Tomcat加载类的顺序和普通的不太一样,如下:
Bootstrap classes of your JVM
System class loader classses (described above)
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
$CATALINA_HOME/common/classes
$CATALINA_HOME/common/endorsed/*.jar
$CATALINA_HOME/common/lib/*.jar
$CATALINA_BASE/shared/classes
$CATALINA_BASE/shared/lib/*.jar
注意,如果希望不使用JVM本身提供的类。这时可以使用jdk的endorsed 特性。

3. Catalina类的作用
如果要启动Tomcat,那么一个org.apache.catalina.startup.Catalina实例就生成,由它完成接下来的工作。
下面是它的启动代码
    public void start() {
        if (server == null) {
            load();
        }
        long t1 = System.currentTimeMillis();
        // Start the new server
        if (server instanceof Lifecycle) {
            try {
                ((Lifecycle) server).start();
            } catch (LifecycleException e) {
                log.error("Catalina.start: ", e);
            }
        }
        long t2 = System.currentTimeMillis();
        log.info("Server startup in " + (t2 - t1) + " ms");
        try {
            // Register shutdown hook
            if (useShutdownHook) {
                if (shutdownHook == null) {
                    shutdownHook = new CatalinaShutdownHook();
                }
                Runtime.getRuntime().addShutdownHook(shutdownHook);
            }
        } catch (Throwable t) {
        }
        if (await) {
            await();
            stop();
        }
    }
启动过程先载入配置文件,然后根据配置文件启动的Server实例启动实例,在实例中注册关闭钩子。
接下来的工作就是等待发出关闭指令或重启指令了。
4. Server对象的生成
服务的生成就是根据配置文件server.xml,实例化的对象。对象实例化过程中,会做载入webapp,在特定端口等待客户连接等工作。
从server.xml到对象的映射是通过commons-digester.jar包完成的。这个包的一个主要功能就是映射xml到java对象。
catalina类的方法createStartDigester完成了这个工作。部分代码如下
Digester digester = new CatalinaDigester();
digester.setValidating(false);
digester.setClassLoader(StandardServer.class.getClassLoader());

// Configure the actions we will be using
digester.addObjectCreate("Server","org.apache.catalina.core.StandardServer", "className");
digester.addSetProperties("Server");
digester.addSetNext("Server","setServer","org.apache.catalina.Server");
digester会在解析之后,返回一个对象。
5. 服务的中止
StandardServer.await是保持tomcat运行的秘密。方法启动一个ServerSocket,侦听发出停止的字符串。这是一个死循环。当有停止运行的字符发出,跳出此循环。
Socket socket = null;
InputStream stream = null;
try {
    socket = serverSocket.accept();
    socket.setSoTimeout(10 * 1000); // Ten seconds
    stream = socket.getInputStream();
} catch (AccessControlException ace) {
......
while (true) {
    ......
    StringBuffer command = new StringBuffer();
    ......
    while (expected > 0) {
        ......
        ch = stream.read();
        ......
         command.append((char) ch);
        ......
    }
    ......
    boolean match = command.toString().equals(shutdown);
    if (match) break;
......
}
......
serverSocket.close();
跳出循环后,系统执行关闭连接等资源的操作,服务就中止了。
我们上面谈到,因为Catalina已经注册了关闭钩子,所以从命令行方式关闭进程也是可以释放资源的。但前提是JVM必须在。如果JVM都立刻杀掉了,释放的操作就不能进行了。
Catalina.stopServer方法用于发出一个让服务停止的指令
Socket socket = new Socket("127.0.0.1", 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();

分享到:
评论

相关推荐

    tomcat启动原理解析

    Tomcat作为一款广泛使用的开源Java应用服务器,其启动过程涉及了众多关键步骤和组件的协同工作。理解Tomcat的启动原理对于开发者来说至关重要,不仅有助于提升性能优化的能力,还能在遇到问题时进行有效调试。以下是...

    Tomcat 6.0启动过程分析

    ### Tomcat 6.0 启动过程分析 #### Bootstrap 类的作用 `Bootstrap` 类作为 Tomcat 的启动入口,承担着构建一个独立的类加载器的任务,用于装载 `Catalina` 的内部类,以此来确保这些内部类与系统的 classpath 相...

    TOMCAT原理详解及请求过程

    ### TOMCAT原理详解及请求过程 #### 一、TOMCAT概述 TOMCAT是一个开源的免费的轻量级Web应用服务器,它主要作为一个JSP/Servlet容器而被广泛使用。Tomcat支持Java Servlet和JavaServer Pages (JSP)技术,并且提供...

    Tomcat启动分析以及如何启动

    理解Tomcat的启动过程和配置对于优化服务器性能和管理Web应用至关重要。本文将深入解析Tomcat的组成部分、启动流程及关键配置文件。 1. Tomcat Server的组成部分 Tomcat的架构由以下几个核心元素构成: 1.1 ...

    https原理及tomcat配置https方法

    3. 启动 Tomcat 服务器:启动 Tomcat 服务器, HTTPS 配置将生效。 HTTPS 是一种基于 HTTP 协议的安全协议,通过使用 SSL/TLS 协议对数据进行加密,以确保数据的安全传输。Tomcat 配置 HTTPS 方法可以通过生成证书...

    Linux 配置 tomcat 开机启动.txt

    了解脚本的工作原理以及如何检查 Tomcat 的状态。 #### 环境准备 - **操作系统**: Linux (例如 CentOS、Ubuntu 等) - **软件**: Apache Tomcat 服务器 - **工具**: Bash 脚本编辑器 #### 步骤详解 1. **配置环境...

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    2. **启动流程**:Tomcat的启动过程涉及服务器配置文件的读取,如server.xml、web.xml等,这些文件定义了服务器的行为和应用的部署信息。Tomcat会根据这些配置启动必要的服务和监听器。 3. **Servlet生命周期**:...

    Eclipse调用Tomcat服务的原理

    ### Eclipse调用Tomcat服务的原理及虚拟部署目录详解 #### 概述 Eclipse作为一款流行的集成开发环境(IDE),被广泛应用于Java Web项目的开发过程中。而在开发Java Web应用时,通常会与Tomcat服务器配合使用。了解...

    tomcat启动的时序图

    通过以上对Tomcat启动流程的解析,我们可以看到Tomcat的启动过程涉及到了多个类和组件的交互与协作。从初始化类加载器、解析配置文件、构建核心组件到最终的启动和服务监听,每一个步骤都至关重要。了解这些细节有助...

    tomcat工作原理-框架

    本文将深入探讨Tomcat的工作原理,包括其启动流程、请求处理机制以及核心组件的功能。 1. **启动流程** - **初始化阶段**: Tomcat启动时会读取`server.xml`配置文件,该文件定义了服务器的各种配置,如端口号、...

    tomcat8:tomcat8源码分析(tomcat-8.0.32版本)

    2. **生命周期管理**:Tomcat使用生命周期接口来管理各个组件的初始化、启动、停止和销毁过程,确保资源的有效利用和正确释放。 3. **部署与加载**:Tomcat通过Web应用目录结构(如WEB-INF/web.xml)自动部署应用,...

    tomcat 源码分析系列文档

    Tomcat的启动过程解析了从命令行启动到服务完全就绪的每一步;而容器思想则强调了Tomcat基于组件的架构,尤其是责任链模式在容器处理链接中的应用。 【标签】"tomcat源码分析"表明整个资料集专注于Tomcat的源代码级...

    我的tomcat7源码手撕过程

    以下是对Tomcat7启动流程的一个深入分析: 1. **启动脚本**:通过执行`startup.bat`或`startup.sh`(取决于操作系统)来启动Tomcat。这些脚本会调用`catalina.bat`或`catalina.sh`。 2. **加载Classpath**:在启动...

    tomcat架构的源码分析

    - `Connector`组件通过`Initialize`和`Start`方法控制其初始化和启动过程。 - `ProtocolHandler`接口用于处理实际的网络通信,由多个具体实现类支持不同的协议(如HTTP/1.1、HTTPS等)。 - 例如`...

    Tomcat7启动分析(三)Digester的使用

    在Tomcat7的启动过程中,涉及到很多内部组件的初始化,其中`Digester`是一个重要的工具,用于解析XML配置文件,将XML结构映射为Java对象。本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `...

    Tomcat源码学习:一个最简单的“Tomcat”

    【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...

    Tomcat 原理解说

    Tomcat 启动过程分析 Tomcat 的启动主要涉及以下几个步骤: 1. **启动命令行参数**:通常通过执行`startup.bat`或`startup.sh`脚本来启动Tomcat。这些脚本设置JVM的环境变量,如`catalina.base`和`catalina.home`...

    tomcat:tomcat源码分析

    1. **启动流程**:Tomcat的启动过程始于`catalina.sh`或`catalina.bat`脚本,接着调用`Catalina`类的`main`方法,启动服务器。在这个过程中,Tomcat会加载配置文件,初始化容器和服务,构建Web应用程序的部署结构。 ...

    tomcat 学习与分析总结资料

    《Tomcat学习与分析总结资料》是一份涵盖了Tomcat服务器核心知识的综合资源,适合对Java Web应用服务器感兴趣的开发者深入学习。Tomcat是Apache软件基金会的项目,是世界上最流行的开源Servlet容器,它实现了Java ...

    tomcat-source:tomcat源码分析

    通过对Tomcat源码的深入学习,我们可以更好地理解其内部工作原理,从而更好地优化应用性能,解决运行时问题,甚至为Tomcat开发新的功能或模块。这个过程不仅提升了编程技能,也为参与其他Java Web项目的开发打下了...

Global site tag (gtag.js) - Google Analytics