tomcat解析(二)

来源:互联网 发布:php excel destroy 编辑:程序博客网 时间:2024/06/05 12:04

Tomcat启动

废话不多说先上图:
类图如下:

时序图如下:

Catalina是整个Tomcat的管理类,它里面的三个方法load,start,stop分别管理整个服务器的生命周期。
代码如下:
(1)验证是否初始化:通过反射实例化Catalina,初始化资源,装入load。
org.apache.catalina.startup.Bootstrap 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);        }    }    public void init(String[] arguments)        throws Exception {        init();        load(arguments);    }    /**     * Initialize daemon.     */    public void init()        throws Exception    {        // Set Catalina path        setCatalinaHome();        setCatalinaBase();        initClassLoaders();        Thread.currentThread().setContextClassLoader(catalinaLoader);        SecurityClassLoad.securityClassLoad(catalinaLoader);        // Load our startup class and call its process() method        if (log.isDebugEnabled())            log.debug("Loading startup class");        Class<?> startupClass =            catalinaLoader.loadClass            ("org.apache.catalina.startup.Catalina");        Object startupInstance = startupClass.newInstance();        // Set the shared extensions class loader        if (log.isDebugEnabled())            log.debug("Setting startup class properties");        String methodName = "setParentClassLoader";        Class<?> paramTypes[] = new Class[1];        paramTypes[0] = Class.forName("java.lang.ClassLoader");        Object paramValues[] = new Object[1];        paramValues[0] = sharedLoader;        Method method =            startupInstance.getClass().getMethod(methodName, paramTypes);        method.invoke(startupInstance, paramValues);        catalinaDaemon = startupInstance;    }     private void load(String[] arguments)        throws Exception {        // Call the load() method        String methodName = "load";        Object param[];        Class<?> paramTypes[];        if (arguments==null || arguments.length==0) {            paramTypes = null;            param = null;        } else {            paramTypes = new Class[1];            paramTypes[0] = arguments.getClass();            param = new Object[1];            param[0] = arguments;        }        Method method =            catalinaDaemon.getClass().getMethod(methodName, paramTypes);        if (log.isDebugEnabled())            log.debug("Calling startup class " + method);        method.invoke(catalinaDaemon, param);        }
(2)Catalina调用Server init方法
org.apache.catalina.startup.Catalina
  public void load() {        long t1 = System.nanoTime();        initDirs();        // 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.toURI().toURL().toString());        } catch (Exception e) {            if (log.isDebugEnabled()) {                log.debug(sm.getString("catalina.configFail", file), e);            }        }        if (inputStream == null) {            try {                inputStream = getClass().getClassLoader()                    .getResourceAsStream(getConfigFile());                inputSource = new InputSource                    (getClass().getClassLoader()                     .getResource(getConfigFile()).toString());            } catch (Exception e) {                if (log.isDebugEnabled()) {                    log.debug(sm.getString("catalina.configFail",                            getConfigFile()), 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 (log.isDebugEnabled()) {                    log.debug(sm.getString("catalina.configFail",                            "server-embed.xml"), e);                }            }        }        if (inputStream == null || inputSource == null) {            if  (file == null) {                log.warn(sm.getString("catalina.configFail",                        getConfigFile() + "] or [server-embed.xml]"));            } else {                log.warn(sm.getString("catalina.configFail",                        file.getAbsolutePath()));                if (file.exists() && !file.canRead()) {                    log.warn("Permissions incorrect, read permission is not allowed on the file.");                }            }            return;        }        try {            inputSource.setByteStream(inputStream);            digester.push(this);            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 {            try {                inputStream.close();            } catch (IOException e) {                // Ignore            }        }        getServer().setCatalina(this);        // Stream redirection        initStreams();        // Start the new server        try {            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");        }    }

(3)StandardServer初始化service
org.apache.catalina.core.StandardServer
@Override    protected void initInternal() throws LifecycleException {                super.initInternal();        // Register global String cache        // Note although the cache is global, if there are multiple Servers        // present in the JVM (may happen when embedding) then the same cache        // will be registered under multiple names        onameStringCache = register(new StringCache(), "type=StringCache");        // Register the MBeanFactory        MBeanFactory factory = new MBeanFactory();        factory.setContainer(this);        onameMBeanFactory = register(factory, "type=MBeanFactory");                // Register the naming resources        globalNamingResources.init();                // Populate the extension validator with JARs from common and shared        // class loaders        if (getCatalina() != null) {            ClassLoader cl = getCatalina().getParentClassLoader();            // Walk the class loader hierarchy. Stop at the system class loader.            // This will add the shared (if present) and common class loaders            while (cl != null && cl != ClassLoader.getSystemClassLoader()) {                if (cl instanceof URLClassLoader) {                    URL[] urls = ((URLClassLoader) cl).getURLs();                    for (URL url : urls) {                        if (url.getProtocol().equals("file")) {                            try {                                File f = new File (url.toURI());                                if (f.isFile() &&                                        f.getName().endsWith(".jar")) {                                    ExtensionValidator.addSystemResource(f);                                }                            } catch (URISyntaxException e) {                                // Ignore                            } catch (IOException e) {                                // Ignore                            }                        }                    }                }                cl = cl.getParent();            }        }        // Initialize our defined Services        for (int i = 0; i < services.length; i++) {            services[i].init();        }    }

(4)StandardService 分别初始化Executor,Connector。
org.apache.catalina.core.StandardService
 @Override    protected void initInternal() throws LifecycleException {        super.initInternal();                if (container != null) {            container.init();        }        // Initialize any Executors        for (Executor executor : findExecutors()) {            if (executor instanceof LifecycleMBeanBase) {                ((LifecycleMBeanBase) executor).setDomain(getDomain());            }            executor.init();        }        // Initialize our defined Connectors        synchronized (connectors) {            for (Connector connector : connectors) {                try {                    connector.init();                } catch (Exception e) {                    String message = sm.getString(                            "standardService.connector.initFailed", connector);                    log.error(message, e);                    if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE"))                        throw new LifecycleException(message);                }            }        }    }



0 0
原创粉丝点击