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

Tomcat源码---容器启动六(4)

阅读更多

现在容器已经启动成功的StanderService#start中继续是executor(不作详解)与connector的启动

 

  1. //两个connector的启动8080 8009  
  2.        synchronized (connectors) {  
  3.            for (int i = 0; i < connectors.length; i++) {  
  4.                if (connectors[i] instanceof Lifecycle)  
  5.                    ((Lifecycle) connectors[i]).start();  
  6.            }  
  7.        }  

 

 

Connector#start  

/**
     * Begin processing requests via this Connector.
     *
     * @exception LifecycleException if a fatal startup error occurs
     */
    public void start() throws LifecycleException {
        if( !initialized )
            initialize();

        // Validate and update our current state
        if (started ) {
            if(log.isInfoEnabled())
                log.info(sm.getString("coyoteConnector.alreadyStarted"));
            return;
        }
        lifecycle.fireLifecycleEvent(START_EVENT, null);
        started = true;

        // We can't register earlier - the JMX registration of this happens
        // in Server.start callback
        if ( this.oname != null ) {
            // We are registred - register the adapter as well.
            try {
                Registry.getRegistry(null, null).registerComponent
                    (protocolHandler, createObjectName(this.domain,"ProtocolHandler"), null);
            } catch (Exception ex) {
                log.error(sm.getString
                          ("coyoteConnector.protocolRegistrationFailed"), ex);
            }
        } else {
            if(log.isInfoEnabled())
                log.info(sm.getString
                     ("coyoteConnector.cannotRegisterProtocol"));
        }

        try {
            //Http11Protocol的启动
            protocolHandler.start();
        } catch (Exception e) {
            String errPrefix = "";
            if(this.service != null) {
                errPrefix += "service.getName(): \"" + this.service.getName() + "\"; ";
            }

            throw new LifecycleException
                (errPrefix + " " + sm.getString
                 ("coyoteConnector.protocolHandlerStartFailed", e));
        }

        if( this.domain != null ) {
            mapperListener.setDomain( domain );
            //mapperListener.setEngine( service.getContainer().getName() );
            mapperListener.init();
            try {
                ObjectName mapperOname = createObjectName(this.domain,"Mapper");
                if (log.isDebugEnabled())
                    log.debug(sm.getString(
                            "coyoteConnector.MapperRegistration", mapperOname));
                Registry.getRegistry(null, null).registerComponent
                    (mapper, mapperOname, "Mapper");
            } catch (Exception ex) {
                log.error(sm.getString
                        ("coyoteConnector.protocolRegistrationFailed"), ex);
            }
        }
    }

 Http11Protocol#start

Http11Protocol#start
 public void start() throws Exception {
        if (this.domain != null) {
            try {
                tpOname = new ObjectName
                    (domain + ":" + "type=ThreadPool,name=" + getName());
                Registry.getRegistry(null, null)
                    .registerComponent(endpoint, tpOname, null );
            } catch (Exception e) {
                log.error("Can't register endpoint");
            }
            rgOname=new ObjectName
                (domain + ":type=GlobalRequestProcessor,name=" + getName());
            Registry.getRegistry(null, null).registerComponent
                ( cHandler.global, rgOname, null );
        }

        try {
            //如名所言,到了终点的启动
            endpoint.start();
        } catch (Exception ex) {
            log.error(sm.getString("http11protocol.endpoint.starterror"), ex);
            throw ex;
        }
        if (log.isInfoEnabled())
            log.info(sm.getString("http11protocol.start", getName()));
    }

 JIoEndPoint#start

public void start()
        throws Exception {
        // Initialize socket if not done before
        if (!initialized) {
            init();
        }
        if (!running) {
            running = true;
            paused = false;

            // Create worker collection
            //如果server.xml所配置executor为空,则采用默认的
            if (executor == null) {
                workers = new WorkerStack(maxThreads);
            }

            // Start acceptor threads
            for (int i = 0; i < acceptorThreadCount; i++) {
		//这里的acceptor是一个线程,里面是一个serversocket的启动
                Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);
                acceptorThread.setPriority(threadPriority);
                acceptorThread.setDaemon(daemon);
                acceptorThread.start();
            }
        }
    }

Acceptor#run

 public void run() {

            // Loop until we receive a shutdown command
            while (running) {

                // Loop if endpoint is paused
                while (paused) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // Ignore
                    }
                }

                // Accept the next incoming connection from the server socket
                try {
		   //这里进行了accept(),等待客户端消息,进行接收
                    Socket socket = serverSocketFactory.acceptSocket(serverSocket);
                    serverSocketFactory.initSocket(socket);
                    // Hand this socket off to an appropriate processor
                    if (!processSocket(socket)) {
                        // Close socket right away
                        try {
                            socket.close();
                        } catch (IOException e) {
                            // Ignore
                        }
                    }
                }catch ( IOException x ) {
                    if ( running ) log.error(sm.getString("endpoint.accept.fail"), x);
                } catch (Throwable t) {
                    log.error(sm.getString("endpoint.accept.fail"), t);
                }

                // The processor will recycle itself when it finishes

            }

        }

    }
 -----到这里启动已经全部完成,等待浏览器客的消息发送,以下详解消息的请求/响应.......
0
0
分享到:
评论

相关推荐

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

    4. **生命周期管理**:在`common`和`shared`目录中,可以看到Tomcat如何管理和控制各个组件的生命周期,包括启动、停止、初始化和销毁等过程。 5. **配置管理**:Tomcat的配置文件通常位于`conf`目录下,源码解析...

    apache-tomcat-6.0.35和apache-tomcat-6.0.35 src

    Apache Tomcat是一款开源的Java Servlet容器,主要用于实现JavaServer Pages (JSP)、Servlet和Java EE的Web应用程序。在这个压缩包中,包含了两个版本:`apache-tomcat-6.0.35` 和 `apache-tomcat-6.0.35 src`。前者...

    apache-tomcat-9.0.8-src源码资源

    它的源码资源对于我们理解Tomcat的工作原理、进行定制开发或者优化性能都具有极大的价值。`apache-tomcat-9.0.8-src`这个压缩包包含了Tomcat 9.0.8版本的完整源代码,这是学习和研究Tomcat的绝佳材料。 1. **Tomcat...

    Tomcat源码apache-tomcat-8.5.47-src.zip

    在开始学习Tomcat源码之前,首先需要了解一些基本概念。Java Servlet是Java平台上的一个标准接口,用于处理HTTP请求。而JSP则是用于创建动态网页的Java技术,它将业务逻辑和页面展示分离。Tomcat作为Servlet容器,...

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    本篇将详细介绍如何使用Ant编译Tomcat源码,以及如何在MyEclipse环境中导入并运行Tomcat源码。 首先,Ant是Apache软件基金会开发的Java项目自动化构建工具,它能够执行编译、测试、打包等任务。在Apache Tomcat的...

    apache-tomcat-6.0.29.zip

    在本压缩包"apache-tomcat-6.0.29.zip"中,包含的是Apache Tomcat 6.0.29版本的源码、配置文件、库文件以及相关的文档资料。 Tomcat 6.0.29是Apache Tomcat的一个稳定版本,发布于2010年,支持Java EE 5规范。以下...

    apache-tomcat-9.0.14-src源码

    对于初次接触Tomcat源码的开发者,可以从阅读`src/main/java`目录下的源码开始,重点关注`org.apache.catalina`包下的类,以及`org.apache.coyote`和`org.apache.jasper`等包。同时,`conf/server.xml`是配置整个...

    apache-tomcat-7.0.59,apache-tomcat-7.0.69 源码

    源码中,`catalina`目录包含了服务器启动、配置加载、容器管理、生命周期管理和请求处理的相关代码。`org.apache.catalina`包下的类是Catalina的核心,如`Engine`、`Host`、`Context`和`Wrapper`,它们代表了不同...

    tomcat7.0.42源码,eclipse直接使用

    4. `bin`:包含了启动和停止Tomcat的脚本,如startup.sh和shutdown.sh,以及管理工具,如catalina.sh。 5. `lib`:存放Tomcat运行所需的JAR文件,包括Servlet和JSP规范的API库。 6. `work`:Tomcat工作目录,这里...

    apache-tomcat-6.0.37

    2. **启动与停止**:使用bin目录下的startup.sh(Unix/Linux)或startup.bat(Windows)脚本来启动Tomcat,shutdown.sh或shutdown.bat则用于关闭服务。 3. **部署应用**:应用程序通常以WAR(Web ARchive)文件的...

    apache-tomcat-7.0.39-src

    Apache Tomcat 7.0.39 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。Tomcat作为一个轻量级的应用服务器,尤其适合运行简单的Java Web应用。以下是...

    tomcat8源码-eclipse工程

    7. **Eclipse集成**:在Eclipse中导入Tomcat源码,可以方便地进行调试、代码分析和自定义修改。这需要配置Tomcat插件,设置源代码路径,以及正确配置项目的构建路径。 8. **部署与调试**:在Eclipse中如何部署Web...

    tomcat-7.0.42-src源码爱好者(已编译导入直接可用)

    通过研究Tomcat源码,开发者可以了解到HTTP请求的处理流程、Servlet容器的工作方式、以及如何高效地管理Web应用。此外,了解Tomcat源码还可以帮助开发者借鉴其设计模式和架构,以便在日常开发中构建更稳定、高效的...

    tomcat-7.0.90-src-源码

    深入Tomcat源码,我们可以学习到以下关键知识点: 1. **Web应用部署**:Tomcat如何解析`WEB-INF/web.xml`配置文件,加载Servlet和Filter,以及如何根据`META-INF/context.xml`设置上下文参数。 2. **生命周期管理*...

    apache-tomcat-9.0.8-src可直接导入eclipse的源码

    了解并分析Tomcat源码对于深入理解Java Web应用的部署和执行机制非常有帮助。 源码包"apache-tomcat-9.0.8-src"包含了Tomcat的所有源代码,包括核心组件、模块和服务。它由多个子目录构成,每个目录对应Tomcat的...

    apache-tomcat-9.0.34-src.zip

    Apache Tomcat是一个开源的Java Servlet容器,主要用于实现JavaServer Pages (JSP)、Java Servlet以及Java EE的Web应用程序。在本例中,我们讨论的是Apache Tomcat 9.0.34的源代码版本,即"apache-tomcat-9.0.34-src...

    linux -win 源码apache-tomcat-8.5.78

    Apache Tomcat 8.5.78 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它实现了Java EE的Web应用程序部分,即Servlet和JSP规范,允许开发者构建和部署动态Web应用。在这个源码...

    tomcat8-redis-session共享

    如果还没有,可以下载Redis源码编译安装,或者使用Docker等容器化工具快速启动。 2. **添加依赖**:在Tomcat的`lib`目录下,添加与Redis相关的Java库,例如`spring-session-data-redis`或`jedis`。压缩包中的jar...

    apache-tomcat-8.5.9-src

    【Apache Tomcat 8.5.9 源码解析】 Apache Tomcat 是一个开源的、免费的应用服务器,主要用于部署Java Servlet 和 JavaServer Pages (JSP) 应用程序。这个压缩包 "apache-tomcat-8.5.9-src" 包含了Tomcat 8.5.9 ...

    tomcat8源码

    Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,...因此,对Tomcat源码的学习对于Java Web开发者来说是至关重要的。

Global site tag (gtag.js) - Google Analytics