`
wu_quanyin
  • 浏览: 208181 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Tomat源码---载入相应的资源及解析四(1)

阅读更多

一,进行了以上的类包加载后,现在主要的工作是载入server.xml,并对里面的配置进行解析,最特别的就是里面各个容器的初始化(Server,Service,Engine,Host,Context).

 

--------------------------------------------------------------------------------------------------------------

 

Process command line argument (start, startd, stop, stopd)

Class: org.apache.catalina.startup.Bootstrap (assume command->start)

What it does: 

a) Catalina.setAwait(true);

b) Catalina.load()

b1) initDirs() -> set properties like 

                 catalina.home

                 catalina.base == catalina.home (most cases)

b2) initNaming

setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,

   org.apache.naming.java.javaURLContextFactory ->default)

b3) createStartDigester() 

Configures a digester for the main server.xml elements like

org.apache.catalina.core.StandardServer (can change of course :)

org.apache.catalina.deploy.NamingResources

Stores naming resources in the J2EE JNDI tree

org.apache.catalina.LifecycleListener

implements events for start/stop of major components

org.apache.catalina.core.StandardService

The single entry for a set of connectors,

so that a container can listen to multiple connectors

ie, single entry

org.apache.coyote.tomcat5.CoyoteConnector

Connectors to listen for incoming requests only

It also adds the following rulesets to the digester

NamingRuleSet

EngineRuleSet

HostRuleSet

ContextRuleSet

b4) Load the server.xml and parse it using the digester

   Parsing the server.xml using the digester is an automatic

   XML-object mapping tool, that will create the objects defined in server.xml

   Startup of the actual container has not started yet.

b5) Assigns System.out and System.err to the SystemLogHandler class

b6) Calls intialize on all components, this makes each object register itself with the 

   JMX agent.

   During the process call the Connectors also initialize the adapters.

   The adapters are the components that do the request pre-processing.

   Typical adapters are HTTP1.1 (default if no protocol is specified,

   org.apache.coyote.http11.Http11Protocol)

   AJP1.3 for mod_jk etc.

-------------------------------------------------------------------------------------------------------------

 

    运行到了Bootstrap#main()

else if (command.equals("start")) {  
             daemon.setAwait(true);  
             daemon.load(args);  
            daemon.start();  
          } 

    接下去主要讲解tomcat的load()方法

    Bootstrap#load(args)

 

 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;
        }
      //通过反射机制运行Catalina#load()方法
        Method method = 
            catalinaDaemon.getClass().getMethod(methodName, paramTypes);
        if (log.isDebugEnabled())
            log.debug("Calling startup class " + method);
        method.invoke(catalinaDaemon, param);

    }

   接着,查看org.apache.catalina.startup.Catalina#load()

   // Start a new server instance.

    public void load() {

        long t1 = System.nanoTime();
	//初始化路径
        initDirs();

        // Before digester - it may be needed

        initNaming();

        // Create and execute our Digester
	//创建该对象,主要是对conf/server.xml进行解析
        Digester digester = createStartDigester();

        InputSource inputSource = null;
        InputStream inputStream = null;
        File file = null;
        try {
            file = configFile();//server.xml文件
            inputStream = new FileInputStream(file);
            inputSource = new InputSource("file://" + file.getAbsolutePath());
        } catch (Exception e) {
            ;
        }
        if (inputStream == null) {
            try {
                inputStream = getClass().getClassLoader()
                    .getResourceAsStream(getConfigFile());
                inputSource = new InputSource
                    (getClass().getClassLoader()
                     .getResource(getConfigFile()).toString());
            } catch (Exception 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 ((inputStream == null) && (file != null)) {
            log.warn("Can't load server.xml from " + file.getAbsolutePath());
            return;
        }

        try {
            inputSource.setByteStream(inputStream);
            //把Catalina这个类压入栈顶部
            digester.push(this);
     //压入顶部之后,在digester中就可以此类与server.xml进行相应的解析,比如该类的server实例化
            digester.parse(inputSource);
            inputStream.close();
        } catch (Exception e) {
            log.warn("Catalina.start using "
                               + getConfigFile() + ": " , e);
            return;
        }

        // Stream redirection
        initStreams();

        // Start the new server
        if (server instanceof Lifecycle) {
            try {
		 //StandarServer开始进行实例化
                server.initialize();
            } catch (LifecycleException e) {
                log.error("Catalina.start", e);
            }
        }

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

    }

 

 

0
0
分享到:
评论

相关推荐

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-...

    Maven使用tomcat8-maven-plugin插件.docx

    Maven 使用 tomcat8-maven-plugin 插件 Maven 是一个流行的构建自动化工具,它可以帮助开发者自动完成项目的编译、测试、打包、部署等任务。 Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-...

    tomcat7-maven-plugin-2.2.jar

    《深入解析修改版tomcat7-maven-plugin-2.2.jar》 在Java开发领域,Maven作为项目管理和构建工具,极大地简化了依赖管理和构建流程。而Tomcat,作为广泛使用的开源Servlet容器,是Java Web应用部署的首选平台。当...

    tomcat-redis-session-manager源码

    《深入解析Tomcat-Redis-Session-Manager源码》 在现代Web应用中,服务器端会话管理是一个至关重要的部分,特别是在高并发、分布式环境中。Tomcat作为最流行的Java Servlet容器,提供了丰富的功能来支持这一需求。...

    开发工具 apache-tomcat-8.0.41-windows-x86

    开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...

    tomcat8-maven-plugin-3.0-r1655215.jar

    解决tomcat8-maven-plugin-3.0-r1655215.jar阿里云同有的问题。放到路径org\apache\tomcat\maven\tomcat8-maven-plugin\3.0-r1655215\就可以了

    apache-tomcat-9.0.8-src源码资源

    通过对`apache-tomcat-9.0.8-src`源码的深入研究,我们可以了解到Tomcat如何处理网络请求,怎样管理Web应用,以及如何实现各种高级特性。这对于开发者来说是一份宝贵的学习资料,可以帮助他们更好地优化应用程序,...

    apache-tomcat-7.0.81-src 源码免费下载

    在"apache-tomcat-7.0.81-src"这个压缩包中,你将获得Tomcat 7.0.81版本的完整源代码,这包括了服务器的所有核心组件和模块。通过分析这些源码,我们可以学习到以下关键知识点: 1. **Servlet容器**:Tomcat作为...

    tomcat8.5.20-redis-session共享-JAR包大全

    apache-tomcat-8.5.20.tar.gz源码包和context.xml文件,这套配置是我自己亲测可用的。。另外我用的redis4这个版本。注意:如果你使用的TOMCAT其他版本。例如tomcat6或者7这套JAR包可能不可用,tomcat8.0没有测试。...

    apache-tomcat-6.0.53-src

    apache-tomcat-6.0.53-src,apache tomcat 6.0.53的源码。 压缩包文件清单: apache-tomcat-6.0.53-src.tar.gz apache-tomcat-6.0.53-src.tar.gz.asc apache-tomcat-6.0.53-src.tar.gz.md5 apache-tomcat-6.0.53-...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    tomcat6-dta-ssl-1.0.0.jar

    tomcat6-dta-ssl-1.0.0.jar 此类文件将有助于tomcat支持ssl协议

    tomcat-redis-session-manager for tomcat8.5

    文件名写错了,此压缩文件支持tomcat8.5。是否支持8.0请自行测试,本人只测试了8.5,可以使用。压缩文件包括tomcat-redis-session-manager-...apache-tomcat-8.5.33.tar.gz,nginx-1.6.2.tar.gz也打包进去,一步到位。

    tomcat源码+文档pdf+源码解析

    这个资源包包含了Tomcat的源码、文档以及源码解析,对于深入理解Tomcat的工作原理、优化应用性能以及进行二次开发具有极大的帮助。 首先,让我们深入探讨Tomcat的源码。源码是软件的基石,通过阅读源码,我们可以...

    tomcat-redis-session-manager包集合下载(tomcat8)

    **知识点四:配置tomcat-redis-session-manager** 1. **添加依赖**:将下载的jar包添加到Tomcat的lib目录,或者在Maven或Gradle项目中添加对应的依赖。 2. **修改Tomcat配置**:在`$CATALINA_HOME/conf/context.xml`...

    apache-tomcat-9.0.27.tar (1)

    apache-tomcat-9.0.27.tar (1)apache-tomcat-9.0.27.tar (1)apache-tomcat-9.0.27.tar (1)apache-tomcat-9.0.27.tar (1)apache-tomcat-9.0.27.tar (1)apache-tomcat-9.0.27.tar (1)apache-tomcat-9.0.27.tar (1)...

    apache-tomcat-8.5.78-windows-x64安装包-kaic.rar

    apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 ...

    tomcat-redis-session-manager-1.2-tomcat-6.jar

    用于配置 tomcat-redis-session-manager

    apache-tomcat-9.0.45-windows-x64

    apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...

Global site tag (gtag.js) - Google Analytics