四. 开启容器
最后是Bootstrap#start()方法的内容了,start()方法结束后,Tomcat就启动成功了。
下面来看一下Bootstrap#start()的内容:
上述的方法调用了Catalina#start()方法,来进一步看一下:
这个方法的核心就是在Server的开启这一步。还是来看一下StandardServer#start()
这段代码非常清晰,先是发送"BEFORE_START_EVENT"事件,然后是"START_EVENT"事件,然后开启各个服务,最后发送"AFTER_START_EVENT"事件
其中StandardService#start()方法的源代码如下:
在此方法中可以看到,Tomcat的所有容器,服务等都已经启动完毕了。Tomcat的启动过程正式结束。
最后是Bootstrap#start()方法的内容了,start()方法结束后,Tomcat就启动成功了。
下面来看一下Bootstrap#start()的内容:
public void start() throws Exception { if (catalinaDaemon == null) init(); // 调用Catalina#start() Method method = catalinaDaemon.getClass().getMethod("start", (Class[]) null); method.invoke(catalinaDaemon, (Object[]) null); }
上述的方法调用了Catalina#start()方法,来进一步看一下:
public void start() { if (server == null) { // server为空,重新载入 load(); } long t1 = System.nanoTime(); // 开启新的Server if (server instanceof Lifecycle) { try { ((Lifecycle) server).start(); } catch (LifecycleException e) { log.error("Catalina.start: ", e); } } long t2 = System.nanoTime(); if (log.isInfoEnabled()) log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms"); // shutdown hook,不太清楚做什么的 try { if (useShutdownHook) { if (shutdownHook == null) { shutdownHook = new CatalinaShutdownHook(); } Runtime.getRuntime().addShutdownHook(shutdownHook); } } catch (Throwable t) { } // await,然后关闭 if (await) { await(); stop(); } }
这个方法的核心就是在Server的开启这一步。还是来看一下StandardServer#start()
public void start() throws LifecycleException { if (started) { log.debug(sm.getString("standardServer.start.started")); return; } // 通知"BEFORE_START_EVENT"事件 lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null); // 通知"START_EVENT"事件 lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; // 开启服务 synchronized (services) { for (int i = 0; i < services.length; i++) { if (services[i] instanceof Lifecycle) ((Lifecycle) services[i]).start(); } } // 通知"AFTER_START_EVENT"事件 lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null); }
这段代码非常清晰,先是发送"BEFORE_START_EVENT"事件,然后是"START_EVENT"事件,然后开启各个服务,最后发送"AFTER_START_EVENT"事件
其中StandardService#start()方法的源代码如下:
public void start() throws LifecycleException { if (log.isInfoEnabled() && started) { log.info(sm.getString("standardService.start.started")); } if (!initialized) init(); // 通知StandardService下面的监听器"BEFORE_START_EVENT"事件 // 这里可以看一下server.xml和Catalina#createStartDigester(),事件监听器在Server和Service下面都有 lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null); if (log.isInfoEnabled()) log.info(sm.getString("standardService.start.name", this.name)); // 通知"START_EVENT"事件 lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; // 开启Container(Engine) if (container != null) { synchronized (container) { if (container instanceof Lifecycle) { ((Lifecycle) container).start(); } } } // 开启executors synchronized (executors) { for (int i = 0; i < executors.size(); i++) { executors.get(i).start(); } } // 开启Connectors synchronized (connectors) { for (int i = 0; i < connectors.length; i++) { if (connectors[i] instanceof Lifecycle) ((Lifecycle) connectors[i]).start(); } } // 通知"AFTER_START_EVENT"事件 lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null); }
在此方法中可以看到,Tomcat的所有容器,服务等都已经启动完毕了。Tomcat的启动过程正式结束。
发表评论
-
出现java.lang.UnsupportedClassVersionError 错误的原因
2010-08-16 23:11 871出现java.lang.UnsupportedClassVer ... -
Tomcat请求处理(七) - Servlet实例的调用
2009-05-07 11:36 1131Tomcat请求处理中Servlet实例的调用是和Filter ... -
请求在Tomcat中传到了CoyoteAdapter的#service()方法中后,就要准备进入Pi
2009-05-07 11:35 1810首先,来看一下Servlet的载入过程。 具体是在org.ap ... -
Tomcat请求处理(五) -- 请求在容器间的流动
2009-05-07 11:34 1433请求在Tomcat中传到了CoyoteAdapter的#ser ... -
Tomcat请求处理(四) -- Request, Response, 和Pipeline
2009-05-07 11:33 12831. Request和Response 当处理请求的时候,To ... -
Tomcat请求处理(三) -- coyote请求处理
2009-05-07 11:32 1323在上一篇文章文章中,Tomcat的请求处理到了JIoEndpo ... -
Tomcat请求处理(二) -- 请求处理框架
2009-05-07 11:30 991书接上文。 当Tomcat的Acceptor监听到有请求到来时 ... -
Tomcat请求处理(一) -- 服务器端口监听
2009-05-07 11:29 1400其实tomcat在哪个类中监听请求的代码很容易找到: 在org ... -
Tomcat启动部分源代码分析(五) -- 应用程序加载
2009-05-07 11:28 1199前面所叙述的tomcat启动 ... -
Tomcat启动部分源代码分析(三) -- 载入
2009-05-07 11:23 1194二. 载入 2. Bootstrap的#Bootstrap#l ... -
Tomcat启动部分源代码分析(二) -- 初始化
2009-05-07 11:20 1098二. 初始化 1. 首先是Bootstrap的#init()操 ... -
Tomcat启动部分源代码分析(一) -- 概览
2009-05-07 11:17 1432一. 概览 本文所涉及的Tomcat为6.0版本。 Tomca ... -
Tomcat的Session管理(二) - Session后台处理
2009-05-07 10:10 971Tomcat会开启一个后台线程每隔一段时间检查Session的 ... -
Tomcat的Session管理(一) - Session的生成
2009-05-07 10:02 1497Session对象的创建一般是源于这样的一条语句: Sessi ...
相关推荐
Tomcat作为一款广泛应用的开源Java Servlet容器,其源代码是理解Web服务器内部运作机制的重要资源。本文将围绕"Tomcat:tomcat源代码maven项目-tomcat source code"这一主题,深入探讨如何利用Maven构建并理解Tomcat ...
Apache Tomcat 8.5.35 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。这个版本特别针对在64位Windows操作系统上运行进行了优化。在本文中,我们将...
- **webapps**目录:存放部署的应用程序,当Tomcat启动时,会自动扫描这个目录下的WAR文件或目录来部署Web应用。 - **logs**目录:存储Tomcat运行时的日志文件。 - **temp**目录:用于临时文件的存储。 - **work...
《深入解析Tomcat工作原理:源代码探索》 Tomcat,作为Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)技术的主要应用服务器,被广泛应用于Web应用程序的部署与运行。《How Tomcat Works》这...
在描述中提到,Tomcat服务器是免费且开放源代码的,这意味着任何人都可以访问其源代码,对其进行修改并自由分发。它的轻量级特性意味着它对系统资源的需求相对较低,特别适合中小规模的Web应用程序。此外,Tomcat ...
这个文件包含了Tomcat的全部源代码和可执行文件。 2. **解压**:使用Linux的`tar`命令解压文件。例如,你可以使用以下命令: ``` tar -zxvf apache-tomcat-9.0.46.tar.gz ``` 3. **移动或复制**:解压后,将...
对于JSP,Tomcat会将其转换为Servlet源代码,编译成类,然后执行。 8. **性能优化** Tomcat可以通过调整各种参数进行性能优化,例如增大最大线程数、启用NIO连接器、开启GZIP压缩等。 9. **故障排查** 当遇到...
2. ** Jasper**:Jasper是Tomcat中的JSP编译器,将JSP文件转换为Java源代码,然后编译为Servlet。Tomcat 7支持JSP 2.2标准。 3. ** Coyote**:Coyote是Tomcat的HTTP/1.1协议处理器,负责接收和处理来自客户端的HTTP...
Apache Tomcat 7.0.108 是一个开源的Java Servlet容器,它实现了Java EE Web应用程序的规范,包括Servlet、JSP(JavaServer Pages)和EL(Expression Language)。这个版本是Tomcat 7系列的一个具体发行版,提供了对...
Tomcat 7.0.37 是一个高度流行的开源Java Servlet容器,由Apache软件基金会维护。这个稳定版本的发布确保了可靠性和性能的优化,使其成为开发者和服务器管理员的首选。Tomcat 7.0.37 版本提供了一个平衡的特性集,...
- `apache-tomcat-5.5.26-src.zip` 包含了Tomcat的源代码,开发者可以通过源码学习Tomcat的工作原理,进行自定义配置或开发新的功能。 - `apache-tomcat-5.5.26.zip` 是预编译的二进制版本,用户可以直接解压并...
Apache Tomcat 9.0.62 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它实现了Java EE的Web应用程序部分,即Servlet和JSP规范,允许开发者构建和部署动态Web应用程序。Tomcat以...
它由Apache Software Foundation维护,是Java社区中的重要组成部分,因为它是免费的、开放源代码的解决方案,具有良好的性能和稳定性。 在"apache-tomcat-8.5.31-windows-x86"压缩包中,包含的主要文件和目录有: ...
- **JSP转换**: JSP页面在首次请求时被Tomcat转换为Servlet源代码,然后编译成.class文件执行。 3. **安装与配置** - **下载与解压**: 下载Apache Tomcat 7.0.63的压缩包,解压到指定目录。 - **设置环境变量**:...
- ** Jasper**:JSP编译器,将JSP页面转化为Servlet源代码并编译。 - **Juli**:日志系统,允许自定义日志配置和多级别的日志记录。 - **Shared Classes**:全局共享的类加载器,允许所有Web应用程序访问相同的...
首先,我们需要从官方渠道下载Apache Tomcat的源代码压缩包。在本例中,提供的文件名为"apache-tomcat-8.0.15.tar.gz",这是一个标准的gzip压缩格式,我们需要将其解压到一个合适的目录。在Ubuntu上,通常会选择 `/...
这将编译源代码并生成可执行的Tomcat。然后,你可以将编译好的Tomcat移动到期望的安装目录。 3. 配置环境变量:为了方便日常使用,需要在系统的环境变量中添加Tomcat的路径。在.bashrc或相应的shell配置文件中添加...
3. **源代码**:如果你下载的是带源码的版本,那么你可以看到Tomcat各个组件的源代码,这对于深入理解和调试Tomcat非常有帮助。 4. **示例应用**:通常会有一些示例应用程序,用于演示如何在Tomcat上部署和运行Web...
Linux是一种自由和开放源代码的操作系统内核,它被广泛用于各种设备,从服务器到智能手机。其稳定性和安全性使得它成为托管像Tomcat这样的服务的理想选择。 Tomcat 8.0是Apache软件基金会的项目之一,它是Java EE 7...
6. work:存放Servlet编译后的类文件和JSP生成的Servlet源代码。 五、Tomcat的安装与配置 1. 解压下载的"apache-tomcat-8.0.3"压缩包到服务器上的合适位置。 2. 配置环境变量,将Tomcat的bin目录添加到PATH中,以...