catalina的启动过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fan510988896/article/details/73603508
实现类:
    qualified name:org.apache.catalina.startup.Catalina

catalina的启动主要是调用了三个方法:
    1、setAwait:设置服务启动之后是否进入等待状态,true则等待
    2、load:加载配置文件config/server.xml,创建并初始化server

    3、start:启动服务器

方法一:

public void setAwait(boolean b) {
    this.await = b;
}
主要用来设置await属性,await属性会在start方法中的服务器启动完之后来判断是否进入等待状态
方法二:

public void load() {
        long t1 = System.nanoTime();
        省略创建server代码,使用Digester来创建
        try {
            this.getServer().init();
        } catch (LifecycleException var24) {
            if(Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) {
                throw new Error(var24);
            }
            log.error("Catalina.start", var24);
        }
        long t2 = System.nanoTime();
        if(log.isInfoEnabled()) {
            log.info("Initialization processed in " + (t2 - t1) / 1000000L + " ms");
        }
}
load方法是根据配置文件config/server.xml创建server对象,并赋值给server属性(通过Digester完成),然后调用init方法。

方法三:

public void start() {

    if(this.getServer() == null) {
        this.load();
    }

    if(this.getServer() == null) {
        log.fatal("Cannot start server. Server instance is not configured.");
    } else {
        long t1 = System.nanoTime();

        try {
            调用server的start方法来启动服务器
            this.getServer().start();
        } catch (LifecycleException var7) {
            log.fatal(sm.getString("catalina.serverStartFail"), var7);

            try {
                this.getServer().destroy();
            } catch (LifecycleException var6) {
                log.debug("destroy() failed for failed Server ", var6);
            }

            return;
        }

        long t2 = System.nanoTime();
        if(log.isInfoEnabled()) {
            log.info("Server startup in " + (t2 - t1) / 1000000L + " ms");
        }
        注册关闭钩子
        if(this.useShutdownHook) {
            if(this.shutdownHook == null) {
                this.shutdownHook = new Catalina.CatalinaShutdownHook();
            }

            Runtime.getRuntime().addShutdownHook(this.shutdownHook);
            LogManager logManager = LogManager.getLogManager();
            if(logManager instanceof ClassLoaderLogManager) {
                ((ClassLoaderLogManager)logManager).setUseShutdownHook(false);
            }
        }
        进入等待状态
        if(this.await) {
            this.await();
            this.stop();
        }

    }
}
catalina的start方法主要是调用了server的start方法来启动服务器,并根据await属性判断是否让程序进入等待状态。
1、判断server是否存在,如果不存在则调用load方法初始化server
2、调用server的start方法来启动服务器
3、注册关闭钩子,并根据await属性判断是否进入等待状态
4、进入等待状态会调用await方法和stop方法,await方法会直接调用server的await方法
   server的await方法会内部执行一个while循环,当循环退出,就会执行stop方法从而关闭服务器。


猜你喜欢

转载自blog.csdn.net/fan510988896/article/details/73603508
今日推荐