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

[经验分享] tomcat(2)之Catalina.java

[复制链接]

尚未签到

发表于 2017-1-24 08:34:33 | 显示全部楼层 |阅读模式
这个类位于org.apache.catalina.startup包中.
其实这个类是启动tomcat的真正的入口类.
从Bootstrap.java中看得出来,其实启动时只执行此类的load和start,并设置此对象的父加载器属性。
我们选来看此类的方法load有什么作。
--------------------------------------------------------
public void load(String args[]) {

        try {
            if (arguments(args))
                load();
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
    注:从方法可以看出,它主要是通过传进来的参数看是否要不要执行load()这个无参的方法。arguments作用就指对不同的参数
    进行属性附值操作,这里start参数是true,因此要执行load();
    我们来看看load的源码:
    -----------------------------------------------------------------------------------------------------------------------
    public void load() {

        long t1 = System.nanoTime(); //返回最准确的可用系统计时器的当前值,以毫微秒为单位。

        initDirs(); //初始化tomcat的目录

        // Before digester - it may be needed

        initNaming();//初始化命名

        // Create and execute our Digester
        Digester digester = createStartDigester();

        InputSource inputSource = null;
        InputStream inputStream = null;
        File file = null;
        try {
            file = configFile();
            inputStream = new FileInputStream(file);
            inputSource = new InputSource("file://" + file.getAbsolutePath()); //加载本置文件conf/server.xml
        } catch (Exception e) {
            ;
        }
        if (inputStream == null) {
            try {
                inputStream = getClass().getClassLoader()
                    .getResourceAsStream(getConfigFile());
                inputSource = new InputSource
                    (getClass().getClassLoader()
                     .getResource(getConfigFile()).toString());
            } catch (Exception e) {
                ;
            }
        }

        // This should be included in catalina.jar
        // Alternative: don't bother with xml, just create it manually.
        if( inputStream==null ) {
            try {
                inputStream = getClass().getClassLoader()
                .getResourceAsStream("server-embed.xml");
                inputSource = new InputSource
                (getClass().getClassLoader()
                        .getResource("server-embed.xml").toString());
            } catch (Exception e) {
                ;
            }
        }
        

        if ((inputStream == null) && (file != null)) {
            log.warn("Can't load server.xml from " + file.getAbsolutePath());
            return;
        }

        try {
            inputSource.setByteStream(inputStream);
            digester.push(this);
            digester.parse(inputSource);
            inputStream.close();
        } catch (Exception e) {
            log.warn("Catalina.start using "
                               + getConfigFile() + ": " , e);
            return;
        }

        // Stream redirection
        initStreams();

        // Start the new server
        if (server instanceof Lifecycle) {
            try {
                server.initialize();
            } catch (LifecycleException e) {
                log.error("Catalina.start", e);
            }
        }

        long t2 = System.nanoTime();
        if(log.isInfoEnabled())
            log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");

    }
   
    我们来一行行的分析上面的为码:
    1)long t1 = System.nanoTime();//返回最准确的可用系统计时器的当前值,以毫微秒为单位。
    此时间主要是用于计算启动的时间,从最后看,只是用于记录进日中用到,
     if(log.isInfoEnabled())
            log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");
            
    2)initDirs();
    初始化目录,也就是把一些目录作为属性写入system属性中,主要是tomcat的一些系统目录,如:
    System.setProperty("catalina.base",
                               catalinaHome);
     System.setProperty("catalina.home", catalinaHome);
     把这些tomcat目录信息写入系统环境变量用,用于后面程序要用到。
     
    3)initNaming();
    也是把一些相关属性写入环境变量中,不过对于作用,目前并不太清楚,如:
     System.setProperty("catalina.useNaming", "false");
     System.getProperty(javax.naming.Context.URL_PKG_PREFIXES);
     System.setProperty(javax.naming.Context.URL_PKG_PREFIXES, value);
     
    4)Digester digester = createStartDigester();
    这个类主要作用就是把配置文件server.xml转换成对象,以便TOMCAT使用和调用。这个类的使用细节有点复杂,目前只知道
    它的作用就是从server.xml中把配置信息加载,并用于初始化server实例,至于初始化的细节要进一步的研究。
    Server是一个接口,位于包:org.apache.catalina
    他的实现类有:StandardServer,StandardService 都位于包:org.apache.catalina.core
    如下:
    public final class StandardServer
    implements Lifecycle, Server, MBeanRegistration
    ---------------------------------------------------------
    public class StandardService
        implements Lifecycle, Service, MBeanRegistration
    可见它们都实现了Lifecycle, Service, MBeanRegistration 三个接口。三个字面意思应为生命周期,服务,Mbean注册器。
   
   
    总结:此类的作用也就是继Bootstrap.java过来,在启动时执行了load()和start();
    load()的作用如下:
    1)返回最准确的可用系统计时器的当前值,以毫微秒为单位。
    2)初始化tomcat目录。
    3)设置一些环境参数,有关于命名的。
    4)得到Digester实例,用于解释server.xml文档,并初化服务器,设置server实例。
    5)设置日志输出和错误输出的地方.
    6)server.initialize(); //服务器进行初始化.
   
    start()的作用如下:
    1)执行server中的start方法:
    ((Lifecycle) server).start();

运维网声明 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-332651-1-1.html 上篇帖子: Tomcat的server.xml文件 下篇帖子: Tomcat 设置堆大小
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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