(2) 从Tomcat启动开始的源码分析--Catalina启动流程

Tomcat启动分析

承接上文Bootstrap类启动都是通过Java反射机制调用Catalina类的方法。

1. org.apache.catalina.startup.Catalina.class

(1) start方法的流程图

主要是获取server对象,如果获取不到server对象,就调用load方法去加载server对象.
然后调用server对象的start方法,完成启动.

Created with Raphaël 2.2.0 开始 getServer()方法获取server对象 server对象是否存在? 调用server对象的start方法 是否使用关闭钩子? 注册shutdownHook 是否等待关闭? 调用server对象的await方法 调用server对象的stop方法 结束 load()方法创建server对象 yes no yes no yes no

(2) load方法的流程图

主要是加载配置文件"conf/server.xml", 通过创建digester对象解析配置文件.
在解析配置文件之前,会先调用digester对象的push方法,传入当前的Catalina对象作为参数.
解析成功之后,server变量引用一个Server对象,默认是org.apache.catalina.core.StandardServer类型的对象,然后调用server对象的setCatalina,setCatalinaHome,setCatalinaBase和init方法,进行对象初始化.

Created with Raphaël 2.2.0 开始 是否已经加载 初始化目录 初始化naming 加载配置文件 创建digester对象 解析配置文件 调用server对象的setCatalina方法 调用server对象的setCatalinaHome方法 调用server对象的setCatalinaBase方法 自定义输出流 调用server对象的init方法 结束 no

(3) start方法中为什么要使用shutdownHook?

start方法利用shutdown hook,确保用户突然退出应用程序时会执行server对象的stop方法.
Java 关闭钩子的介绍参考如下博客链接: JDK ShutdownHook - 优雅地停止服务

        // 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);
            }
        }

        if (await) {
            await();
            stop();
        }

(4) await方法

Catalina对象的start方法会调用server对象的await方法,server对象会使用一个专用的线程来等待关闭命令.await方法会循环等待,直到接收到正确的关闭命令.

(5) stop方法

当await方法返回时,Catalina对象的start方法会调用server对象的stop和destroy方法,从而关闭server对象和其他的组件.
如果使用了关闭钩子,则会在stop方法中移除原先注册的shutdownHook.

    /**
     * Stop an existing server instance.
     */
    public void stop() {

        try {
            // Remove the ShutdownHook first so that server.stop()
            // doesn't get invoked twice
            if (useShutdownHook) {
                Runtime.getRuntime().removeShutdownHook(shutdownHook);

                // If JULI is being used, re-enable JULI's shutdown to ensure
                // log messages are not lost
                LogManager logManager = LogManager.getLogManager();
                if (logManager instanceof ClassLoaderLogManager) {
                    ((ClassLoaderLogManager) logManager).setUseShutdownHook(
                            true);
                }
            }
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            // This will fail on JDK 1.2. Ignoring, as Tomcat can run
            // fine without the shutdown hook.
        }

        // Shut down the server
        try {
            Server s = getServer();
            LifecycleState state = s.getState();
            if (LifecycleState.STOPPING_PREP.compareTo(state) <= 0
                    && LifecycleState.DESTROYED.compareTo(state) >= 0) {
                // Nothing to do. stop() was already called
            } else {
                s.stop();
                s.destroy();
            }
        } catch (LifecycleException e) {
            log.error(sm.getString("catalina.stopError"), e);
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值