四. 开启容器
最后是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 837出现java.lang.UnsupportedClassVer ... -
Tomcat请求处理(七) - Servlet实例的调用
2009-05-07 11:36 1092Tomcat请求处理中Servlet实例的调用是和Filter ... -
请求在Tomcat中传到了CoyoteAdapter的#service()方法中后,就要准备进入Pi
2009-05-07 11:35 1759首先,来看一下Servlet的载入过程。 具体是在org.ap ... -
Tomcat请求处理(五) -- 请求在容器间的流动
2009-05-07 11:34 1383请求在Tomcat中传到了CoyoteAdapter的#ser ... -
Tomcat请求处理(四) -- Request, Response, 和Pipeline
2009-05-07 11:33 12481. Request和Response 当处理请求的时候,To ... -
Tomcat请求处理(三) -- coyote请求处理
2009-05-07 11:32 1274在上一篇文章文章中,Tomcat的请求处理到了JIoEndpo ... -
Tomcat请求处理(二) -- 请求处理框架
2009-05-07 11:30 944书接上文。 当Tomcat的Acceptor监听到有请求到来时 ... -
Tomcat请求处理(一) -- 服务器端口监听
2009-05-07 11:29 1345其实tomcat在哪个类中监听请求的代码很容易找到: 在org ... -
Tomcat启动部分源代码分析(五) -- 应用程序加载
2009-05-07 11:28 1161前面所叙述的tomcat启动 ... -
Tomcat启动部分源代码分析(三) -- 载入
2009-05-07 11:23 1145二. 载入 2. Bootstrap的#Bootstrap#l ... -
Tomcat启动部分源代码分析(二) -- 初始化
2009-05-07 11:20 1056二. 初始化 1. 首先是Bootstrap的#init()操 ... -
Tomcat启动部分源代码分析(一) -- 概览
2009-05-07 11:17 1387一. 概览 本文所涉及的Tomcat为6.0版本。 Tomca ... -
Tomcat的Session管理(二) - Session后台处理
2009-05-07 10:10 935Tomcat会开启一个后台线程每隔一段时间检查Session的 ... -
Tomcat的Session管理(一) - Session的生成
2009-05-07 10:02 1458Session对象的创建一般是源于这样的一条语句: Sessi ...
相关推荐
2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...
3. IDEA中直接Run项目启动Tomcat 4. 浏览器访问http://localhost:8080/xyqas #### 预览 主页 ![](/preview/主页.jpg) 管理员功能下拉列表 ![](/preview/管理员功能下拉列表.jpg) 发表贴子 ![](/...
- 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统、系统监控。 ![统一扫码支付](project-bootstrap/zheng-pay.png) > zheng-ucenter 通用用户管理系统, 实现...
│ 淘淘商城源代码.zip │ ├─01.第一天 │ 01.课程计划.avi │ 02.淘淘商城介绍.avi │ 03.创建后台工程-taotao-parent.avi │ 04.创建taotao-manager.avi │ 05.svn的使用.avi │ 06.ssm框架整合思路.avi │ 07....
但必须得把MyEclipse的编译器调到支持JDK5.0特性,否则源代码可能编译不通过。 <br> 3)项目的目录 a. ejb端 jsfejb3-ejb |-- src |-- org.qiujy.ejb3.dao 持久层DAO接口包 |-- org.qiujy....
Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...
启动前自定义Environment或ApplicationContext iii. 62.3. 构建ApplicationContext层次结构(添加父或根上下文 iv. 62.4. 创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. 外部化SpringApplication配置 ...
然后,web容器当然也要有,这里使用Tomcat6.0版本。然后就是Activiti的Eclipse插件了,这个后面再介绍。 2.1.3. 一分钟入门(见用户手册) 所谓的一分钟入门就是通过运行你下载的包里的wars文件夹里的activiti-...
14.13.8“打开…”菜单的响应代码564 14.13.9“打印…”菜单的响应代码566 14.13.10“剪切”菜单的响应代码568 14.13.11“复制”菜单的响应代码569 14.13.12“粘贴”菜单的响应代码569 14.13.13“全选”菜单的...