`
fjg0427
  • 浏览: 42004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

分享Tomcat源码系列二

 
阅读更多
下面是standardEngine的启动和connector的启动

● standardEngine的启动

(1) 首先是StandardEngine.start()被调用

Java代码

public void start() throws LifecycleException {     
       // Standard container startup       
      //进行logger,manager,cluster,realm,resource的启动       
       super.start();     

(2) super.start()--->org.apache.catalina.core.ContainerBase#start()

Java代码

public synchronized void start() throws LifecycleException {     
//(省略)  server.xml中配置应用组件的启动        
//StandardHost容器的启动,       
        Container children[] = findChildren();       
        for (int i = 0; i < children.length; i++) {       
            if (children[i] instanceof Lifecycle)       
                ((Lifecycle) children[i]).start();       
        }         
   
    //StandardPipeline的启动(容器与容器间的管道)       
        if (pipeline instanceof Lifecycle)       
            ((Lifecycle) pipeline).start();      
}  
(3) StandardHost.start()被调用

Java代码

public synchronized void start() throws LifecycleException {     
//返回到以上的containerBase#start执行pipeline       
      super.start();      

(4) StandardPipeline#start

Java代码

public synchronized void start() throws LifecycleException {     
       // 将会调用HostConfig#start方法       
       lifecycle.fireLifecycleEvent(START_EVENT, null);       
      
       // Notify our interested LifecycleListeners       
       lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);       
}   
(5) HostConfig#start

Java代码

public void start() {      
          //部暑webapps       
          deployApps();                
  }    
(6) HostConfig#deployApps

Java代码

protected void deployApps() {       
    File appBase = appBase();       
    File configBase = configBase();       
    // Deploy XML descriptors from configBase       
    deployDescriptors(configBase, configBase.list());       
    // Deploy WARs, and loop if additional descriptors are found       
    deployWARs(appBase, appBase.list());       
    // Deploy expanded folders       
    deployDirectories(appBase, appBase.list());                 
}   
(7) deployWARs

Java代码

protected void deployWARs(File appBase, String[] files) {     
……     
deployWAR(contextPath, dir, file);              
  } 
(8) deployWAR

Java代码

protected void deployWAR(String contextPath, File war, String file) {     
if (context instanceof Lifecycle) {       
  // (省略)     
            Class clazz = Class.forName(host.getConfigClass());       
            LifecycleListener listener =       
                (LifecycleListener) clazz.newInstance();       
            ((Lifecycle) context).addLifecycleListener(listener);       
        }       
        context.setPath(contextPath);       
        context.setDocBase(file);       
        //以下这一步跟进去,,StandardContext的启动       
        host.addChild(context);             
  }  
(9) StandardContext#start

在Context的启动过程中,主要完成了以下任务。

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

a) 设置web app的具体目录webappResources。

b) postWorkDirectory (),创建临时文件目录。Tomcat下面有一个work目录,用来存放临时文件。

c) 触发START_EVENT事件监听,在这个事件监听里面会启动ContextConfig的start()事件,ContextConfig是用来配置web.xml的。

d) 为context创建welcome files,通常是这三个启动文件:index.html、index.htm、index.jsp

e) 配置filter

f) 启动带有的Servlet。

g) 注册JMX。

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

至此,Container启动完毕,下面是connector的启动。

● connector的启动

(1) org.apache.catalina.connector.Connector.start()

Java代码

public void start() throws LifecycleException {     
           // Http11Protocol的启动     
            protocolHandler.start();     
}  
(2) Http11Protocol#start

Java代码

public void start() throws Exception {     
try {       
            //到了终点的启动       
            endpoint.start();       
        } catch (Exception ex) {       
            log.error(sm.getString("http11protocol.endpoint.starterror"), ex);       
            throw ex;       
        }   
(3) JIoEndPoint#start

Java代码

public void start()       
        throws Exception {                
                  
            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();       
            }       
        } 
(4) Acceptor#run

Java代码

public void run() {                   
// 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);       
               }       
}   
至此Connector.start方法调用完毕。整个server启动完毕。
分享到:
评论

相关推荐

    apache-tomcat-9.0.0.M22

    2. **Jasper**:Jasper是Tomcat的JSP引擎,负责将JSP页面编译成Java源码,再进一步编译为字节码,最后由Java虚拟机执行。JSP的编译过程可以设置为在首次请求时进行,或者在服务器启动时预先完成。 3. **Coyote**:...

    下载tomcat8.5.707070.zip

    Tomcat是Apache软件基金会Jakarta项目的一部分,它遵循Apache Software License v2.0发布,因此是免费且开放源码的。Tomcat的轻量级特性使其成为小型到中型应用的理想选择,尤其是在资源有限的环境中。 标签“java ...

    管理系统系列--计算机毕业设计源码,JavaWeb项目源码,IT技术分享,毕业设计,课程设计,图书管理系统,贪吃蛇,.zip

    【标题】中的“管理系统系列”指的是一个集合了多种管理系统的项目,这可能包括不同领域的应用,如企业资源规划(ERP)、客户关系管理(CRM)或供应链管理(SCM)。在这个特定的例子中,我们关注的是“图书管理系统...

    Tomcat7.0.67:学习tomcat(7.0.67)

    2. **生命周期管理**:Servlet的加载、初始化、服务、销毁过程由Tomcat管理,通过web.xml或注解进行配置。 3. **JSP处理**:Tomcat将JSP转换为Java类,然后编译成字节码执行。 4. **线程模型**:Tomcat使用基于...

    opencms源码

    10.0.1是OpenCms的一个版本,通常包含一系列改进和新功能。 2. **核心组件** - **内容管理**:OpenCms提供了强大的内容创建、审批和发布流程,包括模板驱动的内容生成,支持XML存储内容。 - **工作流**:系统内置...

    基于springboot的餐饮美食分享平台源码+数据库+项目报告.zip

    - **核心特性**:自动配置、起步依赖、内嵌式Web服务器(如Tomcat、Jetty)。 - **自动配置**:通过`@EnableAutoConfiguration`注解,SpringBoot会根据类路径中的jar包自动配置相关组件。 - **起步依赖**:通过`...

    shell脚本编写和源码

    在IT行业中,Shell脚本是Linux和Unix系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。这个压缩包文件包含了关于shell脚本编写和源码的相关资料,非常适合初学者和有...

    j2ee library项目源码给大家分享

    本篇文章将深入探讨一个名为"library"的J2EE项目源码,该源码分享为我们提供了学习和理解J2EE核心概念的宝贵资源。 首先,我们来看看J2EE的核心组件。J2EE包含以下几个主要部分: 1. **Servlet**:Servlet是Java ...

    基于springboot的IT技术交流和分享平台源码数据库.docx

    - 嵌入式服务器:Spring Boot支持嵌入Tomcat、Jetty或Undertow作为内置服务器,使得应用部署更为简单。 - 简化Maven配置:Spring Boot提供了一系列starter POMs,用于简化Maven依赖管理。 2. **Java语言**: - *...

    springboot学习源码

    在源码中,`run()`方法会进行一系列的初始化工作,包括扫描启动类、加载配置、初始化Bean定义等。 配置文件是SpringBoot的另一个关键部分。SpringBoot支持两种主要的配置文件:`application.properties`和`...

    java web的招聘系统 SSH框架 myeclipse 源码 百度云链接分享

    ### Java Web招聘系统的SSH框架与MyEclipse源码解析 #### 一、Java Web技术概述 Java Web技术是构建Web应用程序的重要工具之一,它利用Java编程语言开发网站应用。Java Web技术的优势在于其跨平台性、安全性以及...

    tomcat sql server mysql 批处理

    在描述中提到的博客链接,虽然具体内容未给出,但我们可以推测博主可能分享了如何在Tomcat环境中配置和运行使用SQL Server或MySQL作为后台数据库的Java Web应用,以及如何编写批处理脚本来自动化这些过程。...

    jsp 在线投票系统 源码

    - **JSTL(JSP Standard Tag Library)**:标准标签库,提供了一系列预定义的标签,用于处理常见任务,如循环、条件判断等。 4. **安全性与优化** - **防止SQL注入**:使用预编译语句或ORM框架(如Hibernate)来...

    课设毕设基于SpringBoot+Vue的地方美食分享网站A LW+PPT+源码可运行.zip

    SpringBoot是Spring框架的简化版,它内置了Tomcat服务器,简化了配置,使得开发者能够快速构建可独立运行的Java应用。在本项目中,SpringBoot作为后端框架,负责处理HTTP请求,提供RESTful API接口,实现数据的增删...

    基于 Spring Cloud 2021 、Spring Boot 2.7、 OAuth2 的 RBAC 权限管理系统源码

    这是一个基于最新技术栈,包括Spring Cloud 2021、Spring Boot 2.7和OAuth2的RBAC(Role-Based Access Control)权限管理系统的源码项目。该项目旨在提供一套高效、安全的后端服务框架,用于实现用户权限的精细化...

    基于springboot OA自动化办公系统 毕业设计 源码+sql脚本 完整源码

    2. **内嵌Servlet容器**:如Tomcat或Jetty,可以直接运行jar包,无需额外部署。 3. **起步依赖**:提供了一系列“starter”依赖,帮助开发者快速引入所需功能模块,如数据访问、Web服务等。 4. **自动配置**:根据...

    方立勋 javaweb 源码

    【方立勋 JavaWeb 源码】是一个与JavaWeb开发相关的代码集合,可能是由知名讲师或开发者方立勋创建并分享的。JavaWeb是指使用Java技术进行Web应用程序开发的一系列技术和框架的总称,包括Servlet、JSP、JavaServer ...

    java论坛源码jar包

    2. **Servlet容器与EJB服务器兼容**:JForum可以无缝地在各种Servlet容器如Tomcat、Jetty等,以及Enterprise JavaBeans (EJB)服务器如JBoss、GlassFish上运行。这意味着它具有良好的平台兼容性和部署灵活性。 3. **...

    web_jsp.rar_jsp_jsp web_web jsp _网站源码

    8. **Web应用部署**:如何将源码打包成WAR文件并在Tomcat或其他Web服务器上部署。 9. **安全性**:学习如何保护网站免受SQL注入、跨站脚本攻击等常见的Web安全问题。 10. **调试和错误处理**:如何在开发过程中...

    基于SSH的网上订餐系统源码

    5. 部署与运行:下载项目后,通过集成开发环境(如Eclipse、IntelliJ IDEA)导入,配置好数据库连接,然后通过Tomcat等应用服务器部署并启动。 总结,基于SSH的网上订餐系统结合了Java的三大框架优势,实现了高效、...

Global site tag (gtag.js) - Google Analytics