设为首页 收藏本站
查看: 564|回复: 0

[经验分享] Tomcat启动部分源代码分析(四) -- 开启容器

[复制链接]

尚未签到

发表于 2017-2-5 07:26:29 | 显示全部楼层 |阅读模式
四. 开启容器
最后是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 instanceof Lifecycle)
((Lifecycle) services).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 instanceof Lifecycle)
((Lifecycle) connectors).start();
}
}
// 通知"AFTER_START_EVENT"事件
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
}

在此方法中可以看到,Tomcat的所有容器,服务等都已经启动完毕了。Tomcat的启动过程正式结束。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-337554-1-1.html 上篇帖子: 在Tomcat上如何集成Pentaho和Liferay 下篇帖子: 第三篇:在Tomcat中部署Spring jpetstore
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表