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();
这一篇内容就是这些。下一篇文章将介绍StandardService的工作过程,着重在Web容器的工作原理。
分享到:
相关推荐
**Tomcat启动原理解析** Tomcat作为一款广泛使用的开源Java应用服务器,其启动过程涉及了众多关键步骤和组件的协同工作。理解Tomcat的启动原理对于开发者来说至关重要,不仅有助于提升性能优化的能力,还能在遇到...
【Tomcat 原理解说】 Tomcat 是一个流行的开源Java Servlet容器,它实现了Java EE中的Web应用程序规范。本文将深入解析Tomcat的启动过程、Web容器的功能以及一些不常用的配置选项。 ### 1. Tomcat 启动过程分析 ...
5. **启动和停止Tomcat**: - 启动:在`bin`目录下运行`startup.bat`脚本。 - 停止:运行`shutdown.bat`脚本。 6. **测试安装**:在浏览器中输入`http://localhost:8080`,如果Tomcat已成功启动,你应该能看到...
### Tomcat 6.0 启动过程分析 #### Bootstrap 类的作用 `Bootstrap` 类作为 Tomcat 的启动入口,承担着构建一个独立的类加载器的任务,用于装载 `Catalina` 的内部类,以此来确保这些内部类与系统的 classpath 相...
### TOMCAT原理详解及请求过程 #### 一、TOMCAT概述 TOMCAT是一个开源的免费的轻量级Web应用服务器,它主要作为一个JSP/Servlet容器而被广泛使用。Tomcat支持Java Servlet和JavaServer Pages (JSP)技术,并且提供...
Java 代码启动 Tomcat 在 Java 中,使用 Tomcat 服务器来发布 Web 应用程序是一种常见的做法。下面,我们将详细介绍如何使用 Java 代码来启动 Tomcat 服务器,并实现远程控制 Tomcat。 标题: Java 代码启动 ...
【描述】:Tomcat启动管理工具涵盖了启动、停止、监控以及配置Tomcat服务器的过程。这些工具可以帮助开发者有效地管理他们的应用服务,确保系统稳定运行,并在必要时进行故障排查。 【标签】: 1. Tomcat:Apache ...
之前tomcat启动老是报错,虽然不影响项目的启动运行,但是有强迫症的程序员会心里不爽: 如下: 问题分析 由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境用的...
【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...
在Linux(CentOS7)操作系统中安装Apache Tomcat并将其设置为开机启动是一项常见的任务,特别是在部署Java web应用时。本篇文章将详细讲解如何在CentOS7上安装Tomcat8并将其配置为自启动服务。 首先,我们来了解...
Tomcat报错,如: Can't load IA 32-bit .dll on a AMD 64-bit platform Can't load IA 64-bit .dll on a AMD 64-bit platform 都应该用x64里面的dll文件 不同的硬件平台需要与之对应的dll即可
然而,在使用过程中,用户可能会遇到Tomcat无法启动的问题。本文将详细探讨导致Tomcat启动失败的原因及相应的解决方法,帮助读者有效解决这一问题。 #### 一、常见原因分析 1. **JRE/JDK版本不兼容** - Tomcat的...
jsvc启动tomcat原理详细说明,更安全的启动tomcat的方式。
Tomcat 设置开机自启动 Tomcat 是一款流行的开源 Web 服务器软件,广泛应用于企业级应用开发中。为了确保 Tomcat 服务器的稳定运行,设置开机自启动是非常必要的。下面将详细介绍 Tomcat 设置开机自启动的步骤和...
这个过程对于软件实施工程师来说非常重要,因为它可以简化维护工作,避免每次系统重启后手动启动Tomcat。以下是如何在CentOS 7上设置Tomcat 8开机启动的详细步骤: 1. **配置Tomcat环境变量**: 首先,我们需要在...
理解Tomcat的启动过程和配置对于优化服务器性能和管理Web应用至关重要。本文将深入解析Tomcat的组成部分、启动流程及关键配置文件。 1. Tomcat Server的组成部分 Tomcat的架构由以下几个核心元素构成: 1.1 ...
1. **在MyEclipse中配置Tomcat:** - 点击菜单栏的 `Window` -> `Preferences` -> 选择 `MyEclipse Enterprise Workbench` -> `Servers` -> `Tomcat`。 - 从下拉列表中选择你的Tomcat版本。 - 在Tomcat子目录下...
标题 "Tomcat学习1:源码编译" 涉及到的是对Apache Tomcat服务器的深入理解,尤其是从源代码层面进行构建和编译的过程。Apache Tomcat是一款开源的Java Servlet容器,它实现了Java EE的Web应用规范,是许多Java Web...
### CentOS 设置 Tomcat 开机自启动 #### 一、前言 在生产环境中,为了确保应用服务器能够稳定运行,我们通常需要配置应用服务器在系统重启后自动启动。本篇文章将详细介绍如何在CentOS环境下配置Tomcat服务器实现...
这里我们将详细介绍如何在CentOS 5.3操作系统上进行这些步骤,并附带了如何设置Tomcat自动启动的方法,使用jsvc工具。 首先,我们需要安装JDK。在本文例子里,使用的是JDK 1.6版本。为了安装,你需要将下载的rpm...