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

[经验分享] Tomcat 源码分析[1]

[复制链接]

尚未签到

发表于 2017-1-22 08:13:10 | 显示全部楼层 |阅读模式
水平有限,如有不足请留言交流,互相提高,谢谢!转载请提供出处,http://treblesoftware.iteye.com/admin/blogs/515042


引用
TOMCAT作为世界上使用较为广泛的SERVLET容器被许多项目所应用。是很值得学习的。

首先,我们先要下载TOMCAT的源码,包括要引入TOMCAT的几个依赖包。
1,到 http://tomcat.apache.org/download-60.cgi 下载 Source Code,我下载的是TOMCAT 6.X 版,可以到这里直接下载:http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-6/v6.0.20/src/apache-tomcat-6.0.20-src.tar.gz
2,下载这几个依赖包:org.eclipse.jdt.core.jar (这里可以到ECLIPES架包里找到);wsdl4j.jar;jaxrpc.jar;junit-4.6.jar;ant.jar 。
OK,新建一个JAVA项目,之后把解压好的tomcat源码放入新建项目中,再把依赖包buildpath一下就可以了。
DSC0000.jpg
确保此项目可以正确被构建。
我们首先从 org.apache.catalina.startup; 包中的 Bootstrap 类开始。这个类中拥有一个
MAIN函数入口,我们可以把此入口当作TOMCAT的程序入口,并且在这个类里拥有initClassLoaders,createClassLoader,init,load,start,stop,stopServer,destroy这些方法。
下面是一些源码:

/**
* Start the Catalina daemon.
*/
public void start()
throws Exception {
if( catalinaDaemon==null ) init();
Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
method.invoke(catalinaDaemon, (Object [])null);
}

/**
* Stop the Catalina Daemon.
*/
public void stop()
throws Exception {
Method method = catalinaDaemon.getClass().getMethod("stop", (Class [] ) null);
method.invoke(catalinaDaemon, (Object [] ) null);
}

/**
* Stop the standlone server.
*/
public void stopServer()
throws Exception {
Method method =
catalinaDaemon.getClass().getMethod("stopServer", (Class []) null);
method.invoke(catalinaDaemon, (Object []) null);
}


/**
* Main method, used for testing only.
*
* @param args Command line arguments to be processed
*/
public static void main(String args[]) {
if (daemon == null) {
daemon = new Bootstrap();
try {
daemon.init();
} catch (Throwable t) {
t.printStackTrace();
return;
}
}
try {
String command = "start";
if (args.length > 0) {
command = args[args.length - 1];
}
if (command.equals("startd")) {
args[0] = "start";
daemon.load(args);
daemon.start();
} else if (command.equals("stopd")) {
args[0] = "stop";
daemon.stop();
} else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
} else if (command.equals("stop")) {
daemon.stopServer(args);
} else {
log.warn("Bootstrap: command \"" + command + "\" does not exist.");
}
} catch (Throwable t) {
t.printStackTrace();
}
}

开始发现一点,反射被大量使用了。首先,这里应该不应该使用反射,我想大家意见不一,不过报着学习源码的态度,我们略过,因为我是设置断点进行调试学习的,所以可以更容易跟踪程序的运行步骤。

首先,我们先看看这个Bootstrap类的设计。
public final class Bootstrap {
private static Bootstrap daemon = null;
public static void main(String args[]) {
if (daemon == null) {
daemon = new Bootstrap();
try {
daemon.init();
} catch (Throwable t) {
t.printStackTrace();
return;
}
}
…… …… ……

引用

首先可以看出,daemon做为启动TOMCAT的唯一对象,被设计成了单列。在我认为,daemon 本身就应该为单列对象,它控制着TOMCAT的初始化,本身就应该唯一存在,如果多个daemon 必然导致数据与操控上的问题

除了使用了单列模式,这个类中还使用了类似于Template方法模式,这个应该算是一个简单的Template Method,记得MARTIN FOWLER在《重构》中也有把沉长的代码分解为一个一个算法,之后拼装在一起。在下面这个方法中体现的很好。
public void init()
throws Exception
{
// Set Catalina path
setCatalinaHome();
setCatalinaBase();
initClassLoaders();
…… …… ……


看完了设计,下面我们先搞清楚UML图里的一些属性,它到底是干什么用的,包括深入这几个方法,看看它们是怎么初始化的,关闭的。
DSC0001.jpg

运维网声明 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-331741-1-1.html 上篇帖子: 【转】浅析tomcat nio 配置 下篇帖子: elcipse 远程调试tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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