`
crud0906
  • 浏览: 136102 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

tomcat6学习笔记——Bootstrap、Catalina

阅读更多
前面了解过tomcat的启动脚本,Tomcat的启动是Bootstrap中的main方法

public static void main(String args[]) {

        if (daemon == null) {
            daemon = new Bootstrap();
            try {
                daemon.init();
            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }
        
        // 根据不同的命令参数执行
        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 {
                log.warn("Bootstrap: command \"" + command + "\" does not exist.");
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }

    }


首先是init()

public void init()
        throws Exception
    {

        // Set Catalina path
        // 设置catalina_home属性,tomcat启动脚本里有通过-Dcatalina.home设置
        setCatalinaHome();
        // 设置catalina_base属性,运行多实例的时候该目录与catalina_home不同
        setCatalinaBase();

        // 初始化classloader,读取conf/catalina.properties,根据指定的repository创建classloader
        // 有三个classloader   分别是common、catalina、shared,tomcat6中三个相同
        initClassLoaders();
        // 设置当前线程的classloader
        Thread.currentThread().setContextClassLoader(catalinaLoader);
        // 待研究
        SecurityClassLoad.securityClassLoad(catalinaLoader);

        // 以下通过反射调用Catalina中的方法
        // 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;

    }


然后load,实际上市通过反射调用了catalina的load方法。
1、找到config file(server.xml)
2、创建digester,解析server.xml,生成各组件对象(Server、Service、Container、Connector等)以及建立相互之间的关系。

// Configure the actions we will be using
        digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");
        digester.addSetProperties("Server");
        digester.addSetNext("Server",
                            "setServer",
                            "org.apache.catalina.Server");

        digester.addObjectCreate("Server/GlobalNamingResources",
                                 "org.apache.catalina.deploy.NamingResources");
        digester.addSetProperties("Server/GlobalNamingResources");
        digester.addSetNext("Server/GlobalNamingResources",
                            "setGlobalNamingResources",
                            "org.apache.catalina.deploy.NamingResources");

        digester.addObjectCreate("Server/Listener",
                                 null, // MUST be specified in the element
                                 "className");
        digester.addSetProperties("Server/Listener");
        digester.addSetNext("Server/Listener",
                            "addLifecycleListener",
                            "org.apache.catalina.LifecycleListener");

        digester.addObjectCreate("Server/Service",
                                 "org.apache.catalina.core.StandardService",
                                 "className");
        digester.addSetProperties("Server/Service");
        digester.addSetNext("Server/Service",
                            "addService",
                            "org.apache.catalina.Service");

        digester.addObjectCreate("Server/Service/Listener",
                                 null, // MUST be specified in the element
                                 "className");
        digester.addSetProperties("Server/Service/Listener");
        digester.addSetNext("Server/Service/Listener",
                            "addLifecycleListener",
                            "org.apache.catalina.LifecycleListener");

        //Executor
        digester.addObjectCreate("Server/Service/Executor",
                         "org.apache.catalina.core.StandardThreadExecutor",
                         "className");
        digester.addSetProperties("Server/Service/Executor");

        digester.addSetNext("Server/Service/Executor",
                            "addExecutor",
                            "org.apache.catalina.Executor");

        
        digester.addRule("Server/Service/Connector",
                         new ConnectorCreateRule());
        digester.addRule("Server/Service/Connector", 
                         new SetAllPropertiesRule(new String[]{"executor"}));
        digester.addSetNext("Server/Service/Connector",
                            "addConnector",
                            "org.apache.catalina.connector.Connector");
        // ...



最后start(),同样是在Bootstrap中通过反射调用catalina对象的start方法。

public void start() {

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

        if (getServer() == null) {
            log.fatal("Cannot start server. Server instance is not configured.");
            return;
        }

        long t1 = System.nanoTime();
        
        // Start the new server
        if (getServer() instanceof Lifecycle) {
            try {
                ((Lifecycle) getServer()).start();
            } catch (LifecycleException e) {
                log.error("Catalina.start: ", e);
            }
        }

        long t2 = System.nanoTime();
        if(log.isInfoEnabled())
            log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms");

        try {
            // 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);
                }
            }
        } catch (Throwable t) {
            // This will fail on JDK 1.2. Ignoring, as Tomcat can run
            // fine without the shutdown hook.
        }

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

    }

由于之间digester解析之间的push操作
    digester.push(this);
    digester.parse(inputSource);
解析时通过catalina的setServer方法将创建的StandardServer对象设置进去了,所以上面getServer方法返回digester创建的server对象,然后开始各组件的生命周期。Lifecycle、LifecycleListeners等。
Server start、通知监听器、Service start。。。
分享到:
评论

相关推荐

    前端框架利器——bootstrap

    ### 前端框架利器——Bootstrap深度解析 在前端开发领域,**Bootstrap**无疑是一颗璀璨的明星,它以其简洁直观、功能强大的特性迅速成为众多开发者手中的利器。本文旨在深入探讨Bootstrap的核心价值及其在现代Web...

    JavaWeb旅游网站——BootStrap响应式布局.rar

    JavaWeb旅游网站——BootStrap响应式布局 环境: mysql 8.0 jdk 1.8 tomcat 9 redis 2.9.8 主要功能:用户登录、用户注册、修改密码、旅游路线搜索、旅游线路收藏、线路收藏排行榜

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...

    tomcat7.0学习笔记

    【Tomcat7.0学习笔记】 Tomcat 7.0是Apache软件基金会的Jakarta项目下的一个开源Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Web应用程序提供服务。本笔记主要涵盖了在Linux环境下...

    前端学习笔记_bootstrap.txt

    前端学习笔记_bootstrap,包括bootstrap介绍、栅格系统、全局CSS样式、综合案例

    bootstrap开启与关闭tomcat

    在main方法中,Bootstrap会加载服务器的全局配置文件,如`catalina.properties`,并创建`Catalina`实例,这是Tomcat的主要容器。 2. **服务器配置**: `Catalina`实例会读取`server.xml`等配置文件,解析并构建...

    bootstrap学习笔记

    在“Bootstrap学习笔记”中,作者强调了为什么应该使用Bootstrap,并介绍了其包内容和如何通过在线实例快速上手。学习笔记中还包含了关于Bootstrap环境的安装指南,包括如何下载Bootstrap和理解其文件结构。作者建议...

    前端Bootstrap+Es6+vue学习笔记

    前端Bootstrap+Es6+vue学习笔记 Bootstrap 框架是一种基于 HTML/CSS/JS 的开源框架,由 Twitter 公司的两名技术工程师研发。其主要特点包括: 1. 跨设备跨浏览器:Bootstrap 支持多种设备和浏览器,可以在不同的...

    tomcat-bootstrap and juli.jar

    标题中的“tomcat-bootstrap”和“juli.jar”是Apache Tomcat服务器中两个关键的组件。Tomcat是一款广泛使用的开源Java Servlet容器,它允许开发者部署和运行基于Java的Web应用程序。接下来,我们将深入探讨这两个...

    bootstrap学习笔记-html5

    这个“bootstrap学习笔记-html5”压缩包文件显然包含了有关如何使用Bootstrap和HTML5进行网页设计的资料,非常适合初学者入门。接下来,我们将深入探讨这两个重要主题。 HTML5(超文本标记语言第五版)是网页开发的...

    前端项目笔记——网易云音乐、通用后台管理

    本文将围绕“前端项目笔记——网易云音乐、通用后台管理”这一主题,深入探讨相关知识点,主要关注Vue.js框架的运用和其他前端技术的整合。 一、Vue.js框架基础 Vue.js是一款轻量级的渐进式JavaScript框架,以其...

    Bootstrap的用法学习笔记

    在"Bootstrap的用法学习笔记"中,我们将深入探讨如何有效地利用这个框架。 一、Bootstrap的基本结构 Bootstrap的核心构建块包括网格系统、排版、导航、表单、按钮、图像和其他UI元素。首先,引入Bootstrap库到HTML...

    tomcat源码阅读(一)——环境搭建

    本篇将聚焦于"Tomcat源码阅读(一)——环境搭建",探讨如何搭建一个适合源码学习的开发环境。 首先,我们需要了解Tomcat是什么。Tomcat是一款开源的Java Servlet容器,由Apache软件基金会维护,实现了Java EE中的...

    bootstrap4学习笔记(一)

    bootstrap4学习笔记,中文的,适用于初学者学习,知识点配合案例的。

    catalina.sh

    《catalina.sh详解——深度剖析Tomcat启动脚本》 在Java Web开发领域,Tomcat作为一款广泛应用的开源Servlet容器,其启动、管理和监控离不开一个核心脚本——`catalina.sh`。这个脚本是Tomcat服务器的启动入口,...

    at91sam9263学习笔记 深入学习Bootstrap uboot 到linux MMU

    在深入分析AT91SAM9263的学习笔记中,我们可以了解到关于Bootstrap、uboot以及从Bootstrap到Linux的MMU(内存管理单元)的启动过程和存储空间的布局。以下是对这部分内容的详细知识梳理。 Bootstrap是系统启动时...

    tomcat日志过大问题

    - `catalina.out`是Tomcat默认的日志文件。 - 随着时间的增长,此日志文件可能会变得非常大。 - 大型日志文件可能影响系统性能,并使日志分析变得困难。 2. **影响**: - 性能问题: 大型日志文件可能会占用大量...

Global site tag (gtag.js) - Google Analytics