tomcat源码分析三:tomcat启动与停止

总体概述

tomcat类有三种工作模式,当tomcat作为“独立的Servlet容器“时,tomcat的启动与停止是通过执行bin目录下的脚本完成的。脚本的入口方法是Bootstrap的main方法。具体的启动与停止都是通过BootStrap反射调用Catalina的实例来实现的。Catalina是tomcat生命期的一个开始类,BootStrap是对Catalina类所封装,提供了main()方法,方便调用。下面我们来研究一下tomcat的启动与停止过程。

tomcat运行可以分为以下三个阶段
1. 启动过程:启动相应的Server,Service,Connector等组件
2. 响应过程:主线程等待接收停止tomcat信号,其它线程接收并请求处理。
3. 结束过程:接收到停止信号后,关闭tomcat

总体分析

先看入口类Bootstrap的定义

//几个重要属性

private static Bootstrap daemon = null;
//Catalina类的实例
private Object catalinaDaemon = null;
//三个重要的ClassLoader
ClassLoader commonLoader = null;
ClassLoader catalinaLoader = null;
ClassLoader sharedLoader = null;


public static void main(String args[]) {

        if (daemon == null) {
            // Don't set daemon until init() has completed
            Bootstrap bootstrap = new Bootstrap();
            try {
                bootstrap.init();
            } catch (Throwable t) {
                handleThrowable(t);
                t.printStackTrace();
                return;
            }
            daemon = bootstrap;
        } else {
        // When running as a service the call to stop will be on a new
        // thread so make sure the correct class loader is used to prevent
        // a range of class not found exceptions。
        Thread。currentThread().setContextClassLoader(daemon。catalinaLoader);
    }

        try {
            String command = "start";
            if (args.length > 0) {
                command = args[args.length - 1];
            }

            if (command.equals("startd")) {
                args[args.length - 1] = "start";
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stopd")) {
                args[args.length - 1] = "stop";
                daemon。.stop();
            } else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stop")) {
                daemon.stopServer(args);
            } else if (command.equals("configtest")) {
                daemon.load(args);
                if (null==daemon。getServer()) {
                    System.exit(1);
                }
                System.exit(0);
            } else {
                log.warn("Bootstrap: command \"" + command + "\" does not exist。");
            }
        } catch (Throwable t) {
            // Unwrap the Exception for clearer error reporting
            if (t instanceof InvocationTargetException &&
                    t.getCause() != null) {
                t = t.getCause();
            }
            handleThrowable(t);
            t.printStackTrace();
            System.exit(1);
        }

    }

main() 方法中,首先判定daemon 是否为null,每次通过脚本执行main()函数时,一定会是一个新的线程,所以这里的deamon一定为空,daemon为空时,调用init()方法,该方法的主要功能初始始化相关的ClassLoader,创建catalinaDaemon,即``Catalina实例 ,并且给catalinaDaemon设置相应的parentClassLoader,最后将新建的BootStrap设置给deamon
而后处理具体命令及参数,看到主要的几个调用的方法是

daemon.setAwait(true);  //设置await
daemon.load(args);      //加载配置
daemon.start();         //启动服务
daemon.stop();          // 停止服务
daemon.stopServer(args);   //停止server

上面这五个函数的实现分别分通过反射调用catalinaDaemonsetAwait,load,start,stop,stopServer方法。这五个方法就是tomcat启动与停止的核心方法。这五个方法完成了tomcat的启动,主线程等待,tomcat停止的功能,stop的作用是停止服务,而stopServer的作用是发送停止命令。

首先来看Catalina类的属性的定义

 protected boolean await = false;
 protected
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值