Server 的启动流程

服务器启动

本节介绍Tomcat服务器如何启动。启动tomcat有几种不同的方式,包括:

  • 从命令行。

  • 从Java程序作为嵌入式服务器。

  • 自动作为Windows服务。

描述

启动程序的文本说明可在此处找到。

其中的内容如下:

Tomcat启动顺序

1.从命令行启动
类:org.apache.catalina.startup.Bootstrap
它能做什么:
    a)设置类加载器
        commonLoader(通用) - >系统加载程序
        sharedLoader(共享) - > commonLoader  - >系统加载器
        catalinaLoader(服务器) - > commonLoader  - >系统加载程序
        (默认情况下,commonLoader用于sharedLoader和serverLoader)
    b)加载启动类(反射)
        org.apache.catalina.startup.Catalina
        setParentClassloader  - > sharedLoader
        Thread.contextClassloader  - > catalinaLoader
    c)Bootstrap.daemon.init()完成

顺序2.处理命令行参数(开始,停止)
Class:org.apache.catalina.startup.Bootstrap(假设command-> start)
它能做什么:
    a)Catalina.setAwait(true);
    b)Catalina.load()
        b1)initDirs() - >设置属性,比如catalina.home
                          catalina.base == catalina.home(大多数情况下)
        b2)initNaming
            setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
                    org.apache.naming.java.javaURLContextFactory  - > default)
        b3)createStartDigester()
            为主要server.xml元素配置一个消化器
            org.apache.catalina.core.StandardServer(当然可以改变:)
            org.apache.catalina.deploy.NamingResources
                在J2EE JNDI树中存储命名资源
            org.apache.catalina.LifecycleListener
                实现主要组件启动/停止的事件
            org.apache.catalina.core.StandardService
                一组连接器的单个条目,
                这样一个容器就可以收听多个连接器
                即单个条目
            org.apache.catalina.Connector
                连接器仅侦听传入请求
            它还将以下规则集添加到蒸煮器中
                NamingRuleSet
                EngineRuleSet
                HostRuleSet
                ContextRuleSet
        b4)加载server.xml并使用消化器进行解析
            使用消化器解析server.xml是一种自动操作
            XML对象映射工具,它将创建server.xml中定义的对象
            实际容器的启动尚未开始。
        b5)将System.out和System.err分配给SystemLogHandler类
        b6)调用初始化所有组件,这使得每个对象自己注册
            JMX代理。
            在过程调用过程中,连接器也会初始化适配器。
            适配器是执行请求预处理的组件。
            典型的适配器是HTTP1.1(默认如果没有指定协议,
            org.apache.coyote.http11.Http11NioProtocol)
            AJP1.3 for mod_jk等

    c)Catalina.start()
        c1)启动NamingContext并将所有JNDI引用绑定到它
        c2)启动<服务器>下的服务:
            StandardService  - >启动Engine(ContainerBase  - > Realm,Cluster等)
        c3)StandardHost(由服务启动)
                配置ErrorReportValvem以针对不同的HTTP执行适当的HTML输出
                错误代码
                启动管道中的阀门(至少是ErrorReportValve)
                配置StandardHostValve,
                    这个阀门将Webapp类加载器绑定到线程上下文
                    它也为请求找到会话
                    并调用上下文管道
                启动HostConfig组件
                    这个组件部署所有的webapps
                        (webapps&conf / Catalina / localhost / *。xml)
                    HostConfig将为您的环境创建一个Digester,这个消化器
                    然后会调用ContextConfig.start()
                        ContextConfig.start()将处理默认的web.xml(conf / web.xml)
                        然后处理应用程序web.xml(WEB-INF / web.xml)

        c4)在容器的生命周期(StandardEngine)中有一个后台线程
            不断检查上下文是否已经改变。如果上下文发生变化(战争文件的时间戳,
            上下文xml文件,web.xml),然后发出重新加载(停止/删除/部署/启动)

    d)Tomcat通过HTTP端口接收请求
        d1)该请求由在ThreadPoolExecutor中等待的单独线程接收类。
             它正在等待常规ServerSocket.accept()方法中的请求。
             当收到请求时,该线程唤醒。
        d2)ThreadPoolExecutor分配一个TaskThread来处理请求。
            它还提供了一个JMX对象名称到catalina容器(我相信没用过)
        d3)在这种情况下处理请求的处理器是Coyote Http11Processor,
            并调用处理方法。
            同一个处理器也在继续检查套接字的输入流
            直到达到保持活动点或连接断开。
        d4)使用内部缓冲区类(Http11InputBuffer)解析HTTP请求
            缓冲类解析请求行,标题等,并将结果存储在一个
            Coyote请求(不是HTTP请求)该请求包含所有HTTP信息,例如
            作为服务器名称,端口,方案等
        d5)处理器包含对适配器的引用,在这种情况下,它是
            CoyoteAdapter。一旦请求被解析,Http11Processor
            调用适配器上的service()。在服务方法中,请求包含一个
            CoyoteRequest和CoyoteResponse(第一次为null)
            CoyoteRequest(Response)实现了HttpRequest(Response)和HttpServletRequest(Response)
            适配器解析并将所有内容与请求,cookie,上下文通过a进行关联
            Mapper等
        d6)解析完成后,CoyoteAdapter调用其容器(StandardEngine)
            并调用invoke(request,response)方法。
            这将从引擎级开始将HTTP请求发送到Catalina容器中
        d7)StandardEngine.invoke()只是调用容器的pipeline.invoke()
        d8)默认情况下,发动机只有一个阀门StandardEngineValve,这个阀门很简单
            调用主机流水线上的invoke()方法(StandardHost.getPipeLine())
        d9)StandardHost默认有两个阀门,即StandardHostValve和ErrorReportValve
        d10)标准主阀将正确的类装载机与当前螺纹相关联
             它还检索经理和与请求相关的会话(如果有的话)
             如果有会话访问()被调用来保持会话存活
        d11)之后,StandardHostValve在关联的上下文上调用管道
             与请求。
        d12)由Context管道调用的第一个阀门是FormAuthenticator
             阀。然后StandardContextValve被调用。
             StandardContextValve调用与上下文关联的任何上下文侦听器。
             接下来它调用Wrapper组件上的管道(StandardWrapperValve)
        d13)在调用StandardWrapperValve期间,JSP包装器(Jasper)被调用
             这导致实际编译JSP。
             然后调用实际的servlet。
    e)调用servlet类

启动程序的UML序列图可以 在这里找到。

注释

启动过程可以通过多种方式进行自定义,通过修改Tomcat代码和实现您自己的LifecycleListeners,然后在server.xml配置文件中注册。

Last updated