`
zddava
  • 浏览: 240394 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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上百实例源码以及开源项目源代码

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    基于SSM的论坛问答系统+源代码+文档说明+数据库sql

    3. IDEA中直接Run项目启动Tomcat 4. 浏览器访问http://localhost:8080/xyqas #### 预览 主页 ![](/preview/主页.jpg) 管理员功能下拉列表 ![](/preview/管理员功能下拉列表.jpg) 发表贴子 ![](/...

    单点登录源码

    - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统、系统监控。 ![统一扫码支付](project-bootstrap/zheng-pay.png) &gt; zheng-ucenter 通用用户管理系统, 实现...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 淘淘商城源代码.zip │ ├─01.第一天 │ 01.课程计划.avi │ 02.淘淘商城介绍.avi │ 03.创建后台工程-taotao-parent.avi │ 04.创建taotao-manager.avi │ 05.svn的使用.avi │ 06.ssm框架整合思路.avi │ 07....

    JSF1.2+EJB3.0实现的一个项目实例

    但必须得把MyEclipse的编译器调到支持JDK5.0特性,否则源代码可能编译不通过。 &lt;br&gt; 3)项目的目录 a. ejb端 jsfejb3-ejb |-- src |-- org.qiujy.ejb3.dao 持久层DAO接口包 |-- org.qiujy....

    JAVA上百实例源码以及开源项目

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    springboot参考指南

    启动前自定义Environment或ApplicationContext iii. 62.3. 构建ApplicationContext层次结构(添加父或根上下文 iv. 62.4. 创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. 外部化SpringApplication配置 ...

    Activiti6.0教程例子下载

    然后,web容器当然也要有,这里使用Tomcat6.0版本。然后就是Activiti的Eclipse插件了,这个后面再介绍。 2.1.3. 一分钟入门(见用户手册) 所谓的一分钟入门就是通过运行你下载的包里的wars文件夹里的activiti-...

    Java开发技术大全 电子版

    14.13.8“打开…”菜单的响应代码564 14.13.9“打印…”菜单的响应代码566 14.13.10“剪切”菜单的响应代码568 14.13.11“复制”菜单的响应代码569 14.13.12“粘贴”菜单的响应代码569 14.13.13“全选”菜单的...

Global site tag (gtag.js) - Google Analytics