Tomcat启动过程(一):从BootStrap到EndPonit
Tomcat版本tomcat6.0.44
观察catalina.sh文件,启动入口:org.apache.catalina.startup.Bootstrap,
该类main方法执行下面三个方法
-------------------------------------------------
init() load() start()
得到Catalina实例 | |
| |
| |
| |
| |
catalina.java | |
-----------------------↓---------------------↓-------------
load() start() Catalina的load()方法:
| | a、调用initDirs和initNaming()做tmp路径和命名的初始化。
| | b、调用 createStartDigester();生成Digester对象。Digester类负责进行配置文件的解析。
| | c、加载配置文件(server.xml),获取输入流InputStream对象
| | d、利用Digester解析配置文件输入流,解析之后,获取配置的root节点表示对象,也就是Server对象。
| | e、对上一步生成的server对象进行初始化,调用initialize()启动
standServer.java | |
-----------------------↓---------------------↓-------------
initialize() start() Server遍历下属的多个Service,调用每一个server的initialize()/start()
| |
| |
| |
| |
standService.java | |
-----------------------↓---------------------↓-------------
initialize() start()
| |
| |
| |
| |
connector.java | |
-----------------------↓---------------------↓-------------
initialize() container.start()------>容器Engine.start(),先不关注
| executor.start()------->线程池执行器初始化,该线程做什么用?
| connector.start()------>遍历所有的下属connector,并分别start(),重点分析
| |
| | Connector的initialize()方法:
| | a、protocolHander.setAdapter(new CoyoteAdapter(this))
| | b、调用protocolHander的init()方法
| |
| |
Http11NioProtocol.java |
-----------------------↓---------------------↓-------------
init() start()
| | HTTP1ApiProtocol的init()方法:
| | a、ep.sethander(Http11ConnectionHandler)
| | b、调用ep的init
NioEndpoint.java | |
-----------------------↓---------------------↓-------------
init() start()
NioEndpoint.init()
{
ServerSocketChannel serverSock = ServerSocketChannel.open(); //server通道初始化
serverSock.socket().bind(addr,backlog); //绑定地址,开始进行监听accecpt事件
NioSelectorPool selectorPool.open();//选择器池初始化
……
}
NioEndpoint.start()
{
//初始化处理线程池,该线程用来处理数据请求
executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf);
//初始化poller后台线程组
for()
{
Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-"+i);
pollerThread.start();
}
//初始化acceptor后台线程组
for()
{
Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);
acceptorThread.start();
}
……
}
Tomcat启动过程(一):从BootStrap到EndPonit的更多相关文章
- Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程
Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理.需要解决的问题有监听.协议以及处理器映射等等. 一.Connector设计 Connector要实现的 ...
- CentOS7 Tomcat 启动过程很慢,JVM上的随机数与熵池策略
1. CentOS7 Tomcat 启动过程很慢 在centos启动官方的tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的: <co ...
- Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程
Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 ser ...
- Tomcat源码分析 (七)----- Tomcat 启动过程(二)
在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析.实例化各大组件.初始化组件等逻 ...
- 浅读tomcat架构设计和tomcat启动过程(1)
一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...
- 转:Tomcat启动过程中找不到JAVA_HOME JRE_HOME的解决方法
转自:http://blog.sina.com.cn/s/blog_61c006ea0100l1u6.html 原文: 在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomca ...
- Tomcat启动过程中找不到JAVA_HOME解决方法
在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到. 报错信息如下:Neither the JAVA_HOME nor the JRE_HOME en ...
- Tomcat启动过程中找不到JAVA_HOME JRE_HOME的解决方法
转自:http://blog.sina.com.cn/s/blog_61c006ea0100l1u6.html 原文: 在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomca ...
- Tomcat源码分析 (六)----- Tomcat 启动过程(一)
说到Tomcat的启动,我们都知道,我们每次需要运行tomcat/bin/startup.sh这个脚本,而这个脚本的内容到底是什么呢?我们来看看. 启动脚本 startup.sh 脚本 #!/bin/ ...
随机推荐
- php 防止sql注入
Q:如果把用户输入的没有任何改动的放到SQL的查询语句中,很有可能会导致SQL注入,比如说下面的例子: $unsafe_variable = $_POST['user_input']; mysql_q ...
- 第3章 System V IPC
3.1 概述 System V IPC 包含:System V消息队列.System V信号量.System V共享内存. 3.2 key_t 键和 ftok函数 这三种类型的System V IPC ...
- 使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间
http://zhangrenfang8738.blog.163.com/blog/static/95401881201142711450245/ curl监控站点响应时间 2011-05-27 11 ...
- MongoDB条件查询
1.查询集合中的所有记录 db.users.find() { "_id" : ObjectId("528b1173613e3289197a6486"), &qu ...
- 视频相关android软件
1. 视频解码工具:ffmpeg, http://www.ffmpeg.org/ 2. java有一个开源程序: yoyoPlayer, 可以到这个代码中去学习相关的音频知识.http://www.b ...
- requestDisallowInterceptTouchEvent
ViewPager来实现左右滑动切换tab,如果tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比如想滑动tab项中的可水平滑动的控件,却导致tab切换. 因为Android事件机制是从父 ...
- C# ToolStripProgressBar
ToolStripProgressBar 将所有 ToolStrip控件的移动和渲染功能和其典型的进程跟踪功能结合在一起.ToolStripProgressBar通常放在StatusStrip中,偶尔 ...
- selenium借助AutoIt识别上传文件Java篇
官方网站:https://www.autoitscript.com/site/ 从网站上下载AutoIt并安装,安装完成在菜单中会看到图4.13的目录: 图4.13 AutoIt菜单 1.首先打开A ...
- 从手工测试转型web自动化测试继而转型成专门做自动化测试的学习路线。
在开始之前先自学两个工具商业web自动化测试工具请自学QTP:QTP的学习可以跳过,我是跳过了的.开源web自动化测试工具请自学Selenium:我当年是先学watir(耗时1周),再学seleniu ...
- TCP和HTTP的关系
TCP和HTTP的关系 首先简单地看看tcp,TCP连接是通过4个值来识别的: <源IP地址 源端口号 目的IP地址 目的端口号> 这四个值定义了一个TCP连接,两条不同的TCP连接中这四 ...