精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-25
最后修改:2010-12-21
一般,我们直接运行startup.sh 来 启动Tomcat 。最终执行的命令是: java [options] org.apache.catalina.startup.Bootstrap start options是JVM启动参数,这里忽略。
main方法可见,Tomcat 的启动类是org.apache.catalina.startup.Bootstrap , 启动参数是start 。我们从该类的main 方法看起。 public static void main(String args[]) { try { // Attempt to load JMX class new ObjectName("test:foo=bar"); } catch (Throwable t) { System.out.println(JMX_ERROR_MESSAGE); try { // Give users some time to read the message before exiting Thread.sleep(5000); } catch (Exception ex) { } return; } 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(); } }
第一阶段乍一看,第一段似乎可有可无。它只是创 建了一个不被使用的ObjectName 对象,如果创建失败,就打印一条错误信息。而 且在Tomcat 6 中,已经移除了这段代码。 try { // Attempt to load JMX class new ObjectName("test:foo=bar"); } catch (Throwable t) { System.out.println(JMX_ERROR_MESSAGE); try { // Give users some time to read the message before exiting Thread.sleep(5000); } catch (Exception ex) { } return; }
private static final String JMX_ERROR_MESSAGE = "This release of Apache Tomcat was packaged to run on J2SE 5.0 \n" + "or later. It can be run on earlier JVMs by downloading and \n" + "installing a compatibility package from the Apache Tomcat \n" + "binary download page.";
第二阶段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(); }
启动参数的区别我们先看看start 和startd 。处理start 的 代码比startd 仅多了一行: daemon.setAwait(true);
这行代码执行后,主线程(即main
函数所在的线程)在Tomcat
启
动过程结束时并不会退出,而是监听SHUTDOWN
端口(默认端口是8005
)。该端口如果接收SHUTDOWN
命
令,就停止Tomcat
;如果收到的是其他命令,则忽略,继续监听。这样,我
们就可以在Tomcat
进程之外通过网络停止Tomcat
。
一个Bug关于这4
个启动参数的讨论,可以参见Bug
47881
。这个Bug
的本意是要指出第三段代码的一个问题
,不过恰好讨论了各种启动参数的区别。
这 个Bug 已经在Tomcat 6 中解决了。
Tomcat 7中引入的configtest启动参数在Tomcat 7中,新增了configtest启动参数。 public static void main(String args[]) { // 省略部分代码 if (command.equals("startd")) { args[args.length - 1] = "start"; daemon.load(args); daemon.start(); // 省略部分代码 } else if (command.equals("configtest")) { daemon.load(args); if (null==daemon.getServer()) { System.exit(1); } System.exit(0); } else { // 省略部分代码 }
顾名思义,configtest是为了检测配置参数是否正确,配置参数的主要来源就是conf/server.xml。
从代码可以看出,configtest启动参数就是把load方法给执行了一遍,然后无条件退出。load方法的代码,另文表述 。这里只要知道,load的主要工作之一就是解析conf/server.xml,从而起到检测配置参数是否正确的作用。
configtest通过exit status来返回检测结果。1表示检测到错误,0表示检测结果正确。如果load方法执行成功,就会创建server实例,通过daemon.getServer方法返回;反之,如果配置参数不正确,load方法执行失败,那么就不创建server实例,deamon.getServer方法就返回null。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-27
好像比较详细,排版也不错,支持LZ
|
|
返回顶楼 | |
发表时间:2010-03-28
nice - 看过Tomcat6的源码,后面看不下去了
今天看LZ的讲解,相当到位 这么好的文章,不能停止,加油咯^_^ |
|
返回顶楼 | |
发表时间:2010-03-28
如果是出于工作目的,工作中还在用Tomcat5,看看Tomcat5的源代码还有点价值。
如果是出于纯粹的研究目的,想了解一下最新的情况, 那么看Tomcat5的源代码并没有多大用处,Tomcat5目前应该算是处于维护阶段了。 推荐你去看看最新的Tomcat7,虽然没正式发布,但是变动还是相当大的, 比如所有的代码基几乎都转到Java 5了,还删掉了很多冗余的文件, 增加了很多新功能(特别是异步API的实现)。 |
|
返回顶楼 | |
发表时间:2010-03-28
最后修改:2010-03-28
ZHH2009 写道 如果是出于工作目的,工作中还在用Tomcat5,看看Tomcat5的源代码还有点价值。
如果是出于纯粹的研究目的,想了解一下最新的情况, 那么看Tomcat5的源代码并没有多大用处,Tomcat5目前应该算是处于维护阶段了。 推荐你去看看最新的Tomcat7,虽然没正式发布,但是变动还是相当大的, 比如所有的代码基几乎都转到Java 5了,还删掉了很多冗余的文件, 增加了很多新功能(特别是异步API的实现)。 多谢提醒!选择5.5版,确实是出于工作需要,呵呵。如果能够把5.5研究清楚,我想再去看7,应该会轻松很多。 |
|
返回顶楼 | |
浏览 4357 次