从开始学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作为一款广泛使用的开源Java应用服务器,其启动过程涉及了众多关键步骤和组件的协同工作。理解Tomcat的启动原理对于开发者来说至关重要,不仅有助于提升性能优化的能力,还能在遇到问题时进行有效调试。以下是...
### Tomcat 6.0 启动过程分析 #### Bootstrap 类的作用 `Bootstrap` 类作为 Tomcat 的启动入口,承担着构建一个独立的类加载器的任务,用于装载 `Catalina` 的内部类,以此来确保这些内部类与系统的 classpath 相...
### TOMCAT原理详解及请求过程 #### 一、TOMCAT概述 TOMCAT是一个开源的免费的轻量级Web应用服务器,它主要作为一个JSP/Servlet容器而被广泛使用。Tomcat支持Java Servlet和JavaServer Pages (JSP)技术,并且提供...
理解Tomcat的启动过程和配置对于优化服务器性能和管理Web应用至关重要。本文将深入解析Tomcat的组成部分、启动流程及关键配置文件。 1. Tomcat Server的组成部分 Tomcat的架构由以下几个核心元素构成: 1.1 ...
2. **启动流程**:Tomcat的启动过程涉及服务器配置文件的读取,如server.xml、web.xml等,这些文件定义了服务器的行为和应用的部署信息。Tomcat会根据这些配置启动必要的服务和监听器。 3. **Servlet生命周期**:...
3. 启动 Tomcat 服务器:启动 Tomcat 服务器, HTTPS 配置将生效。 HTTPS 是一种基于 HTTP 协议的安全协议,通过使用 SSL/TLS 协议对数据进行加密,以确保数据的安全传输。Tomcat 配置 HTTPS 方法可以通过生成证书...
了解脚本的工作原理以及如何检查 Tomcat 的状态。 #### 环境准备 - **操作系统**: Linux (例如 CentOS、Ubuntu 等) - **软件**: Apache Tomcat 服务器 - **工具**: Bash 脚本编辑器 #### 步骤详解 1. **配置环境...
### Eclipse调用Tomcat服务的原理及虚拟部署目录详解 #### 概述 Eclipse作为一款流行的集成开发环境(IDE),被广泛应用于Java Web项目的开发过程中。而在开发Java Web应用时,通常会与Tomcat服务器配合使用。了解...
通过以上对Tomcat启动流程的解析,我们可以看到Tomcat的启动过程涉及到了多个类和组件的交互与协作。从初始化类加载器、解析配置文件、构建核心组件到最终的启动和服务监听,每一个步骤都至关重要。了解这些细节有助...
本文将深入探讨Tomcat的工作原理,包括其启动流程、请求处理机制以及核心组件的功能。 1. **启动流程** - **初始化阶段**: Tomcat启动时会读取`server.xml`配置文件,该文件定义了服务器的各种配置,如端口号、...
2. **生命周期管理**:Tomcat使用生命周期接口来管理各个组件的初始化、启动、停止和销毁过程,确保资源的有效利用和正确释放。 3. **部署与加载**:Tomcat通过Web应用目录结构(如WEB-INF/web.xml)自动部署应用,...
Tomcat的启动过程解析了从命令行启动到服务完全就绪的每一步;而容器思想则强调了Tomcat基于组件的架构,尤其是责任链模式在容器处理链接中的应用。 【标签】"tomcat源码分析"表明整个资料集专注于Tomcat的源代码级...
以下是对Tomcat7启动流程的一个深入分析: 1. **启动脚本**:通过执行`startup.bat`或`startup.sh`(取决于操作系统)来启动Tomcat。这些脚本会调用`catalina.bat`或`catalina.sh`。 2. **加载Classpath**:在启动...
- `Connector`组件通过`Initialize`和`Start`方法控制其初始化和启动过程。 - `ProtocolHandler`接口用于处理实际的网络通信,由多个具体实现类支持不同的协议(如HTTP/1.1、HTTPS等)。 - 例如`...
在Tomcat7的启动过程中,涉及到很多内部组件的初始化,其中`Digester`是一个重要的工具,用于解析XML配置文件,将XML结构映射为Java对象。本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `...
【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...
Tomcat 启动过程分析 Tomcat 的启动主要涉及以下几个步骤: 1. **启动命令行参数**:通常通过执行`startup.bat`或`startup.sh`脚本来启动Tomcat。这些脚本设置JVM的环境变量,如`catalina.base`和`catalina.home`...
1. **启动流程**:Tomcat的启动过程始于`catalina.sh`或`catalina.bat`脚本,接着调用`Catalina`类的`main`方法,启动服务器。在这个过程中,Tomcat会加载配置文件,初始化容器和服务,构建Web应用程序的部署结构。 ...
《Tomcat学习与分析总结资料》是一份涵盖了Tomcat服务器核心知识的综合资源,适合对Java Web应用服务器感兴趣的开发者深入学习。Tomcat是Apache软件基金会的项目,是世界上最流行的开源Servlet容器,它实现了Java ...
通过对Tomcat源码的深入学习,我们可以更好地理解其内部工作原理,从而更好地优化应用性能,解决运行时问题,甚至为Tomcat开发新的功能或模块。这个过程不仅提升了编程技能,也为参与其他Java Web项目的开发打下了...