tomcat解析(二)
发布日期:2021-10-18 18:51:24 浏览次数:3 分类:技术文章

本文共 11370 字,大约阅读时间需要 37 分钟。

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

转载地址:https://blog.csdn.net/u011153869/article/details/53115931 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java代理机制
下一篇:tomcat解析(一)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月06日 06时02分35秒