一路跋山涉水,这是最后一章了。



关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类。

理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了。

为了让用户更方便的启动tomcat,还有批处理文件startup.bat(终于见到最顶层的模块了!!)

Catalina

先说Catalina

它里面有一个Server组件(不懂的看第14章)。同时在它的start方法中包含一个Digester对象(不懂的看第15章)用来解析conf/下的Server.xml(这个xml装配起Catalina类里面的那个Server组件)。

同时Catalina本身也有main方法,在运行main方法的时候需要加上启动参数。可选start,stop,debug等等

我们看看process方法

  1. public void process(String args[]) {
  2.  
  3. setCatalinaHome(); //设定Home与Base的值为user.dir
  4. setCatalinaBase();
  5.  
  6. if (arguments(args)) //省略try catch
  7. execute(); //检查args的格式
  8. }
  9. protected void execute() throws Exception {
  10. if (starting)
  11. start();
  12. else if (stopping)
  13. stop();
  14. }

我们主要看如何启动。

   

  1. protected void start() { //省略了大量非核心代码 及try catch
  2. ...
  3. // Create and execute our Digester
  4. Digester digester = createStartDigester(); //这个要是不懂看15章
  5. File file = configFile(); //指定文件为conf/server.xml
  6. InputSource is =new InputSource("file://" + file.getAbsolutePath());
  7. FileInputStream fis = new FileInputStream(file);
  8. is.setByteStream(fis);
  9. digester.push(this); //把catalina自己放了进去
  10. //catalina里有server组件
  11. digester.parse(is);
  12. fis.close();
  13.  
  14. ...
  15. // Start the new server
  16. if (server instanceof Lifecycle) {
  17. server.initialize();
  18. // Wait for the server to be told to shut down
  19. server.await(); //上面的英文再给大家解释一下吧
  20. //除非收到SHUTDOWM的指令 就一直阻塞在这里
  21. //这要是不懂 回去看第二三章
  22. }
  23. ...
  24. // Shut down the server
  25. if (server instanceof Lifecycle) {
  26. ((Lifecycle) server).stop();
  27. }
  28. }

这里有一个问题

server.initialize();

server从哪里来的?

别急看createStartDigester方法。

 

  1. protected Digester createStartDigester() {
  2.  
  3. // Initialize the digester
  4. Digester digester = new Digester();
  5. if (debug)
  6. digester.setDebug(999);
  7. digester.setValidating(false);
  8.  
  9. // Configure the actions we will be using
  10. digester.addObjectCreate("Server",
  11. "org.apache.catalina.core.StandardServer",
  12. "className");
  13. digester.addSetProperties("Server");
  14. //解释一下下面
  15. //在解析server.xml时 如果碰到Server这个模式
  16. //就调用栈底元素的方法名为setServer参数为org.apache.catalina.Server的方法
  17. //把Server自己(就是上面addObjectCreate产生的那个)注入栈底的那个元素
  18. //那么栈底是什么呢?
  19. //digester.push(this); 看看这行代码还有Catalian的setServer方法
  20. digester.addSetNext("Server",
  21. "setServer",
  22. "org.apache.catalina.Server");
  23.  
  24. .....
  25. return digester
  26. }

Bootstrap类

现在说说Bootstrap

Bootstrap的main方法会实例化一个Catalina对象,并调用它的process方法。

在main方法中,首先会创建三个类加载器。

为什么?就是为了不让应用程序中的类使用WEB-INF/Class和WEB-INF/lib之外的类。

具体怎么做的看第八章。

  1. public static void main(String args[]) {// 省略非核心代码及try catch
  2. // Construct the class loaders we will need
  3. ClassLoader commonLoader = null;
  4. ClassLoader catalinaLoader = null;
  5. ClassLoader sharedLoader = null;
  6. ...
  7.  
  8. // Load our startup class and call its process() method
  9. // Instantiate a startup class instance
  10. if (debug >= 1)
  11. log("Loading startup class");
  12. Class startupClass =
  13. catalinaLoader.loadClass
  14. ("org.apache.catalina.startup.Catalina");
  15. Object startupInstance = startupClass.newInstance(); //加载Catalina类
  16.  
  17. // Call the process() method
  18. if (debug >= 1)
  19. log("Calling startup class process() method");
  20. methodName = "process";
  21. paramTypes = new Class[1];
  22. paramTypes[0] = args.getClass();
  23. paramValues = new Object[1];
  24. paramValues[0] = args;
  25. method =
  26. startupInstance.getClass().getMethod(methodName, paramTypes);
  27. method.invoke(startupInstance, paramValues); //调用Catalina的process方法
  28. }

关于startup.bat的知识,我们下一节再谈... 哎还有一节呀

How tomcat works 读书笔记十七 启动tomcat 上的更多相关文章

  1. How tomcat works 读书笔记十七 启动tomcat 下

    在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释 ...

  2. How Tomcat Works 读书笔记 八 载入器 上

    Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...

  3. How tomcat works 读书笔记十二 StandardContext 上

    在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个in ...

  4. how tomcat works 读书笔记(二)----------一个简单的servlet容器

    app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...

  5. how tomcat works 读书笔记四 tomcat的默认连接器

    事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...

  6. how tomcat works 读书笔记(一)----------一个简单的webserver

    http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...

  7. how tomcat works 读书笔记(一)----------一个简单的web服务器

    http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext tran ...

  8. how tomcat works读书笔记 七 日志记录器

    大家可以松一口气了,这个组件比较简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. packag ...

  9. How tomcat works 读书笔记十五 Digester库 下

    在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...

随机推荐

  1. Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段 ...

  2. 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

     新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...

  3. 【Netty源码分析】Reactor线程模型

    1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...

  4. Android动态加载入坑指南

    曾几何时,国内各大公司掀起了一股研究Android动态加载的技术,两年多过去了,动态加载技术俨然成了Android开发中必须掌握的技术.那么动态加载技术是什么呢,这里谈谈我的个人看法,如有雷同,纯属偶 ...

  5. Android中三种计时器Timer、CountDownTimer、handler.postDelayed的使用

    在android开发中,我们常常需要用到计时器,倒计时多少秒后再执行相应的功能,下面我就分别来讲讲这三种常用的计时的方法. 一.CountDownTimer 该类是个抽象类,如果要使用这个类中的方法, ...

  6. (九十六)借助APNS实现远程通知、后台任务

    APNS全称为Apple Push Notification Service,可以实现在app不启动时也能通过服务器推送到iOS端特定设备的功能. APNS的实现原理为先发送设备的UDID和应用的Bu ...

  7. jquery实战第一讲---概述及其入门实例

    就在5月28号周四下午五点的时候,接到xxx姐姐的电话,您是xxx吗?准备一下,周五上午八点半去远洋面试,一路风尘仆仆,颠颠簸簸,由于小编晕车,带着晕晕乎乎的脑子,小编就稀里糊涂的去面试了,温馨提醒, ...

  8. 【一天一道LeetCode】#171. Excel Sheet Column Number

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. Opencv2.4.9、VS2010配置及grabcut代码实例

    最近opencv库更新到了2.4.9,作为小码农的我紧跟时代的步伐,装了2.4.9这个库.以下是我的配置步骤: 1.从http://opencv.org/上下载opencv2.4.9文件,由于我用的是 ...

  10. Swift基础之实现下拉变大和OC下拉变大上拉缩小Demo

    Swift语言实现下拉变大效果:(上拉缩小效果随后研究......) 关键代码:方法一: self.automaticallyAdjustsScrollViewInsets = false;      ...