zoukankan      html  css  js  c++  java
  • tomcat启动(三)Catalina简要分析

    上篇解析Bootstrap到

    daemon.setAwait(true);
    daemon.load(args);
    daemon.start();

    这三个方法实际是反射调用org.apache.catalina.startup.Catalina类的方法

    对Catalina类有一段解释

    这个google翻译真强

    Startup/Shutdown shell program for Catalina. The following command line options
     are recognized: 
    •-config {pathname} - Set the pathname of the configuration file to be processed.
       If a relative path is specified, it will be interpreted as relative to the directory 
       pathname specified by the "catalina.base" system property. [conf/server.xml]
    •-help - Display usage information.
    •-nonaming - Disable naming support.
    •configtest - Try to test the config
    •start - Start an instance of Catalina.
    •stop - Stop the currently running instance of Catalina.
    Catalina的启动/关闭shell程序。可以识别以下命令行选项:
    •-config {pathname} - 设置要处理的配置文件的路径名。如果指定了相对路径,
    它将被解释为相对于由“catalina.base”系统属性指定的目录路径名。
    [conf / server.xml]
    •-help - 显示使用信息。
    •-nonaming - 禁用命名支持。
    •configtest - 尝试测试配置
    •start - 启动Catalina的实例。
    •stop - 停止当前正在运行的Catalina实例。

    setAwait load() ,start()方法

    setAwait() 略过。。。这个方法设置一个boolean值的await也不知道干吗了

    load()方法里

    几个重要的类和方法在后面会详细解释

    createStartDigester()

    Digester.java

    InputSource

    /**
         * Start a new server instance.
         */
        public void load() {
    
            long t1 = System.nanoTime();
    
            initDirs();这里主要是获取java.io.tmpdir操作系统缓存临时目录
    
            // Before digester - it may be needed
            initNaming();初始化命名服务的基本配置
    
            // Create and execute our Digester下面会详细探索这个方法作用
            Digester digester = createStartDigester();Digester类,主要用于处理xml配置文件(如conf/server.xml),根据xml的结构转生成对应的java对象
    
            InputSource inputSource = null;
            InputStream inputStream = null;
            File file = null;
            try {
                try {// 配置文件,由命令行参数-config指定,否则取默认值conf/server.xml
                    file = configFile();
                    inputStream = new FileInputStream(file);
                    inputSource = new InputSource(file.toURI().toURL().toString());
                } catch (Exception e) {
                    if (log.isDebugEnabled()) {
                        log.debug(sm.getString("catalina.configFail", file), e);
                    }
                }
                。中间省略一大堆前置条件。就是判断inputStream和inputSource为空的操作
            。
            。
    try { inputSource.setByteStream(inputStream); digester.push(this);
    //解析server.xml里的Server并复制给Catalina类的server属性,而Server只有一个标准实现StandardServer,所以后面的getServer()即返回StandardServer digester.parse(inputSource); }
    catch (SAXParseException spe) { log.warn("Catalina.start using " + getConfigFile() + ": " + spe.getMessage()); return; } catch (Exception e) { log.warn("Catalina.start using " + getConfigFile() + ": " , e); return; } } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { // Ignore } } } //是代表一个servlet容器A Server element represents the entire Catalina servlet container getServer().setCatalina(this);为server设置外置Catalina组件component,这里设置当前Catalina对象为外置组件 getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile()); getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile()); // Stream redirection流的重定向,将out和err进行包装 initStreams();//Replace System.out and System.err with a custom PrintStream // Start the new server try {
    //Prepare the component for starting.
    //This method should perform any initialization required post object creation.
    //The following LifecycleEvents will be fired in the following order:  getServer().init(); }
    catch (LifecycleException e) { if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) { throw new java.lang.Error(e); } else { log.error("Catalina.start", e); } } long t2 = System.nanoTime(); if(log.isInfoEnabled()) { log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms"); } }

    Catalina 的start()方法

    判断server是否为空,空就调用load()加载组件,不为空就调用server.start()方法

     这个方法最终执行了server的start

    在启动后会注册Register shutdown hook注册关闭钩子

    /**Prepare for the beginning of active use of the public methods other than property getters/setters 
    and life cycle methods of this component. This method should be called before any of the public methods other than property getters/setters
    and life cycle methods of this component are utilized. The following LifecycleEvents will be fired in the following order: 1.BEFORE_START_EVENT: At the beginning of the method. It is as this point the state transitions to LifecycleState.STARTING_PREP. 2.START_EVENT: During the method once it is safe to call start() for any child components.   It is at this point that the state transitions to LifecycleState.   STARTING and that the public methods other than property getters/setters and life cycle methods may be used. 3.AFTER_START_EVENT: At the end of the method, immediately before it returns. It is at this point that the state
    transitions to LifecycleState.STARTED. Throws:LifecycleException - if this component detects a fatal error that prevents this component from being used
    */ 准备开始这个active , 这个start方法是所有组件的公共方法 tomcat中所有的server组件都实现了org.apache.catalina.Lifecycle这个接口。 对于Lifecycle接口的解释Common interface for component life cycle methods管理组件生命周期的公共接口 start方法是定义在Lifecycle接口中 getServer().start(); // Register shutdown hook if (useShutdownHook) { if (shutdownHook == null) { shutdownHook = new CatalinaShutdownHook(); } Runtime.getRuntime().addShutdownHook(shutdownHook); // If JULI is being used, disable JULI's shutdown hook since // shutdown hooks run in parallel and log messages may be lost // if JULI's hook completes before the CatalinaShutdownHook() LogManager logManager = LogManager.getLogManager(); if (logManager instanceof ClassLoaderLogManager) { ((ClassLoaderLogManager) logManager).setUseShutdownHook( false); } }

    进入详细探索。分割条出来吧O(>人<)O


     太长了。下一章吧

    神级博客:

     holly2k大神关于tomcat解析的目录http://blog.csdn.net/holly2k/article/category/1348477

    tomcat源码分析-Bootstrap操作Catalina

  • 相关阅读:
    lab anycast rp
    激光 & 激光器
    管道机器人结构设计及控制系统搭建
    自动开关灯装置
    基于MATLAB步态算法仿真的六足仿生机器人
    蓝牙AT模式
    语音识别LD3320
    蓝牙模块设置
    6红外遥控程序
    62、如何消除碎片文件
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/7700810.html
Copyright © 2011-2022 走看看