tomcat启动(三)Catalina简要分析
上篇解析Bootstrap到
daemon.setAwait(true);
daemon.load(args);
daemon.start();
这三个方法实际是反射调用org.apache.catalina.startup.Catalina类的方法
对Catalina类有一段解释
这个google翻译真强
Startup/Shutdown shell program for Catalina. The following command line options
are recognized:
•-config {pathname} - Set the pathname of the configuration file to be processed.
If a relative path is specified, it will be interpreted as relative to the directory
pathname specified by the "catalina.base" system property. [conf/server.xml]
•-help - Display usage information.
•-nonaming - Disable naming support.
•configtest - Try to test the config
•start - Start an instance of Catalina.
•stop - Stop the currently running instance of Catalina.
Catalina的启动/关闭shell程序。可以识别以下命令行选项:
•-config {pathname} - 设置要处理的配置文件的路径名。如果指定了相对路径,
它将被解释为相对于由“catalina.base”系统属性指定的目录路径名。
[conf / server.xml]
•-help - 显示使用信息。
•-nonaming - 禁用命名支持。
•configtest - 尝试测试配置
•start - 启动Catalina的实例。
•stop - 停止当前正在运行的Catalina实例。
setAwait load() ,start()方法
setAwait() 略过。。。这个方法设置一个boolean值的await也不知道干吗了
load()方法里
几个重要的类和方法在后面会详细解释
createStartDigester()
Digester.java
InputSource
/**
* Start a new server instance.
*/
public void load() { long t1 = System.nanoTime(); initDirs();这里主要是获取java.io.tmpdir操作系统缓存临时目录 // Before digester - it may be needed
initNaming();初始化命名服务的基本配置 // Create and execute our Digester下面会详细探索这个方法作用
Digester digester = createStartDigester();Digester类,主要用于处理xml配置文件(如conf/server.xml),根据xml的结构转生成对应的java对象 InputSource inputSource = null;
InputStream inputStream = null;
File file = null;
try {
try {// 配置文件,由命令行参数-config指定,否则取默认值conf/server.xml
file = configFile();
inputStream = new FileInputStream(file);
inputSource = new InputSource(file.toURI().toURL().toString());
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("catalina.configFail", file), e);
}
}
。中间省略一大堆前置条件。就是判断inputStream和inputSource为空的操作
。
。
try {
inputSource.setByteStream(inputStream);
digester.push(this);
//解析server.xml里的Server并复制给Catalina类的server属性,而Server只有一个标准实现StandardServer,所以后面的getServer()即返回StandardServer
digester.parse(inputSource);
} catch (SAXParseException spe) {
log.warn("Catalina.start using " + getConfigFile() + ": " +
spe.getMessage());
return;
} catch (Exception e) {
log.warn("Catalina.start using " + getConfigFile() + ": " , e);
return;
}
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// Ignore
}
}
}
//是代表一个servlet容器AServer
element represents the entire Catalina servlet container
getServer().setCatalina(this);为server设置外置Catalina组件component,这里设置当前Catalina对象为外置组件
getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile());
getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile()); // Stream redirection流的重定向,将out和err进行包装
initStreams();//Replace System.out and System.err with a custom PrintStream // Start the new server
try {
//Prepare the component for starting.
//This method should perform any initialization required post object creation.
//The followingLifecycleEvent
s will be fired in the following order:
getServer().init();
} catch (LifecycleException e) {
if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) {
throw new java.lang.Error(e);
} else {
log.error("Catalina.start", e);
}
} long t2 = System.nanoTime();
if(log.isInfoEnabled()) {
log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");
}
}
Catalina 的start()方法
判断server是否为空,空就调用load()加载组件,不为空就调用server.start()方法
这个方法最终执行了server的start
在启动后会注册Register shutdown hook注册关闭钩子
/**Prepare for the beginning of active use of the public methods other than property getters/setters
and life cycle methods of this component.
This method should be called before any of the public methods other than property getters/setters
and life cycle methods of this component are utilized.
The following LifecycleEvents will be fired in the following order:
1.BEFORE_START_EVENT: At the beginning of the method. It is as this point the state transitions to LifecycleState.STARTING_PREP.
2.START_EVENT: During the method once it is safe to call start() for any child components.
It is at this point that the state transitions to LifecycleState.
STARTING and that the public methods other than property getters/setters and life cycle methods may be used.
3.AFTER_START_EVENT: At the end of the method, immediately before it returns. It is at this point that the state
transitions to LifecycleState.STARTED.
Throws:LifecycleException - if this component detects a fatal error that prevents this component from being used
*/
准备开始这个active ,
这个start方法是所有组件的公共方法
tomcat中所有的server组件都实现了org.apache.catalina.Lifecycle这个接口。
对于Lifecycle接口的解释Common interface for component life cycle methods管理组件生命周期的公共接口
start方法是定义在Lifecycle接口中 getServer().start(); // Register shutdown hook
if (useShutdownHook) {
if (shutdownHook == null) {
shutdownHook = new CatalinaShutdownHook();
}
Runtime.getRuntime().addShutdownHook(shutdownHook); // If JULI is being used, disable JULI's shutdown hook since
// shutdown hooks run in parallel and log messages may be lost
// if JULI's hook completes before the CatalinaShutdownHook()
LogManager logManager = LogManager.getLogManager();
if (logManager instanceof ClassLoaderLogManager) {
((ClassLoaderLogManager) logManager).setUseShutdownHook(
false);
}
}
进入详细探索。分割条出来吧O(>人<)O
太长了。下一章吧
神级博客:
holly2k大神关于tomcat解析的目录http://blog.csdn.net/holly2k/article/category/1348477
tomcat源码分析-Bootstrap操作Catalina
tomcat启动(三)Catalina简要分析的更多相关文章
- tomcat启动(三)Catalina分析-load方法分析
load()方法按从上到下顺序分析(主要分析本人所没学过的知识点,其它略过...). Digester类作用 使用sax技术对xml进行解析 未开始解析时Digester.push(this)这个用来 ...
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...
- tomcat启动(六)Catalina分析-StandardServer.start()
从链接 Tomcat中组件的生命周期管理公共接口Lifecycle 可以知道调用的是StandardServer.startInternal() @Override protected void st ...
- tomcat启动(五)Catalina分析-service.init
上篇写到StandardService.init() 这个方法做什么呢?一起来看看. 这个类也是实现了Lifecycle 如图.这个图中i表示Interface接口.如Lifecycle,Contai ...
- tomcat启动(四)Catalina分析-server的init()方法
上一回load()方法解析讲到xml解析完成. load()内部接下来会获取server getServer().setCatalina(this); 这个server从createStartDige ...
- tomcat启动批处理——catalina.bat
这个批处理才是tomcat服务器启动跟关闭的核心脚本.其中包括....(各种变量),此节将详细讲解这个批处理的逻辑. 先看看第一部分脚本: ****************************** ...
- Tomcat启动脚本catalina.sh
1 - 概述脚本catalina.sh用于启动和关闭tomcat服务器,是最关键的脚本另外的脚本startup.sh和shutdown.sh都是使用不同的参数调用了该脚本该脚本的使用方法如下(引自该脚 ...
- tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)
tomcat启动(六)Catalina分析-StandardServer.start() 上一篇分析到:Http11NioProcessor.process(SocketWrapper<S> ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
随机推荐
- 20145209 2016-2017-2 《Java程序设计》第6周学习总结
20145209 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 4.1 Y86指令集体系结构 •有8个程序寄存器:%eax.%ecx.%edx.%ebx.% ...
- 105032014138_牟平_z作业1
2)NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. ...
- [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?
场景:在平常我们使用word文档等等office办公软件时,我们常会使用搜索->替换的功能. mysql: 在mysql 中有时候,我们也需要这样子的实现: 实现 SQL 语句: update ...
- Android Studio注释摸版配置
随意创建一个类,就会自动生成注释摸版: 配置后的效果: 以下步骤是配置过程: 1.在创建类的过程中,对类进行自定义摸版,只需在 File->Settins->Editor->File ...
- AndroidPn推送测试
服务器搭建好了之后,往客户端推送.按照里面自带的一个client,可以分别在模拟器和真机上分别测试,不过由于这个框架真的不是很完善,会遇到各种问题. (1) 其中还遇到了一个安卓模拟器的问题,启动模拟 ...
- EF添加Msysql实体异常:表“TableDetails”中列“IsPrimaryKey”的值为 DBNull。 ---> System.InvalidCastException: 指定的转换无效。
尝试一下以下步骤: 1.关闭VS项目, 以管理员权限来打开: 1.执行语句 set global optimizer_switch='derived_merge=OFF'; set optimizer ...
- NETSDK1061错误解决
NETSDK1061错误解决 在vs生成和运行都正常,发布的时候报错 .netcore控制台项目引用另一个类库 错误信息 NETSDK1061: 项目是使用 Microsoft.NETCore.App ...
- web窗体ListView配置分页
一.配置objectDataSource 1.选择业务逻辑层的类,再选择对应的分页方法 2.配置Select对应的方法,必须是一个带两个整型参数的方法,第一个参数表示要查看的第一条记录的前一条,第二个 ...
- hdu 5500 Reorder the Books
http://acm.hdu.edu.cn/showproblem.php?pid=5500 Reorder the Books Time Limit: 4000/2000 MS (Java/Othe ...
- day103 跨域请求 与频率访问限制.
目录 一.跨域请求 二.频率访问限制 一 .同一个域下的ajax请求访问 url文件 from django.conf.urls import url from django.contrib imp ...