`
yjhexy
  • 浏览: 332256 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

tomcat分配请求之——请求如何流程Connection

阅读更多

 

首先摘自我的好友。傻博语录:人生就是悲剧

 

上次说到每一个请求会分配给一个Worker处理,而Worker与我们平时写代码都是围绕Servlet写的,到底又有些什么差别呢?

worker后面是委托给Handler处理的。

handler处理的时候分配给Http11Processor(Http11Processor被维护在一个先进先出队列当中)。

而所有的HttpProcessor共享Http11Protocal 的Adapter成员变量,Adapter会调用到Servlet,即所有Handler都用同一个Adapter。

首先请看图:



 讲述下每个部分的作用:

 

JioEndPointer:启动一个线程监听socket,并把到来的请求分配给相应的worker

Http11ConnectionHandler: Http协议的基于普通IO的处理方式.

Adapter:Http协议的请求 委托或 适配给 servlet容器处理的适配器

attributes:Http协议的相关属性设置


其中的对应关系也非常重要:

A,1个worker 必须对应一个 Http11ConnectionHandler 中的Http11ConnectionProcessor(是handler里面真正处理的Http协议的类)

 

B,所有的worker都持有同一个Adapter

 

 

 

详细类图下图所示:

 



 

 

我在HttpServlet的service方法里设置了一个断点,然后调试了下,可以看一下调用栈。 

 调用栈很清晰得说明了调用到哪些类和顺序:也可以看官方化得时序图: 

http://tomcat.apache.org/tomcat-6.0-doc/architecture/requestProcess/requestProcess.pdf

 

 

 

JIoEndpoint.java

/** * Create (or allocate) and return an available processor for use in * processing a specific HTTP request, if possible. If the maximum * allowed processors have already been created and are in use, return * <code>null</code> instead. */ protected Worker createWorkerThread() { synchronized (workers) { if (workers.size() > 0) { curThreadsBusy++; return workers.pop(); } if ((maxThreads > 0) && (curThreads < maxThreads)) {              // 默认maxThreads 为200 curThreadsBusy++; if (curThreadsBusy == maxThreads) { log.info(sm.getString("endpoint.info.maxThreads", Integer.toString(maxThreads), address, Integer.toString(port))); } return (newWorkerThread()); } else { if (maxThreads < 0) { curThreadsBusy++; return (newWorkerThread()); } else { return (null); } } } } /** * Create and return a new processor suitable for processing HTTP * requests and returning the corresponding responses. */ protected Worker newWorkerThread() { Worker workerThread = new Worker(); workerThread.start(); return (workerThread); }

 


 

从代码来看,如果没有到达请求最大值,首先会从栈中取得空闲的Worker,或者创建新的Worker。

 

所以来一个请求,会分配给一个Worker,而Worker做了一些接收Socket,设置一些socket和需要的环境类,然后就交给了Servlet实例,而servlet实例启动的时候就是对于一个context 中配置的一个servlet只启动一个实例。

 

 StandardWrapper.java

/** * Load and initialize an instance of this servlet, if there is not already * at least one initialized instance. This can be used, for example, to * load servlets that are marked in the deployment descriptor to be loaded * at server startup time. */ public synchronized Servlet loadServlet() throws ServletException { // Nothing to do if we already have an instance or an instance pool // 初始化servlet的时候,如果发现已经初始化完毕,则不再初始化 if (!singleThreadModel && (instance != null)) return instance;

 


 

所以首先servlet不是线程安全的。

其次 HttpSession不是线程安全的。

还有 Context不是现成安全的。

 

Request是线程安全的。

 

  • 大小: 101.1 KB
  • 大小: 136.9 KB
  • 大小: 21.9 KB
  • 大小: 100.1 KB
分享到:
评论

相关推荐

    Tomcat 配置与优化方案详解

    首先需要了解Tomcat的配置文件——server.xml。它是Tomcat的核心配置文件,包含了多个子元素用于配置Tomcat的各个组件。server.xml文件中的主要元素包括、、和。其中,元素代表整个Catalina容器,是整个配置文件的根...

    Tomcat工作原理祥解

    Apache Group基于Sun Microsystems的JSWDK (Java Servlet Web Development Kit),开发了一款集成了Servlet和JSP功能的服务器——Tomcat。 - **Jakarta项目**:Tomcat作为Jakarta项目的一部分,得到了广泛的社区支持...

    tomcat 常用配置

    通过阅读源码,可以理解Tomcat的工作原理,如请求处理流程、线程模型等。同时,利用各种工具,如JVisualVM、JProfiler等,可以监控Tomcat的内存、CPU使用情况,进行性能调优。 总的来说,理解并熟练配置`server.xml...

    tomcat-jdbc.jar+tomcat-juli.jar

    在处理数据库连接方面,Tomcat提供了自己的数据源实现——tomcat-jdbc.jar,这是一个高效且线程安全的连接池实现。同时,tomcat-juli.jar是Tomcat的日志实用程序库,用于更灵活的日志管理。这两个JAR文件在开发和...

    Tomcat管理工具lambdaprobe工具及使用配置

    标题"Tomcat管理工具lambdaprobe工具及使用配置"表明我们将讨论的是一个用于管理Apache Tomcat服务器的工具——lambdaprobe。Tomcat是一款流行的开源Java Servlet容器,它用于部署和运行Java Web应用程序。...

    配置-Tomcat多server.rar_Tomcat 配置 多个服务地址

    描述中的“Tomcat 下如果需要多地址 配置目录下面加载新的路径”提到了关键配置元素——`&lt;Host&gt;`标签,这是在Tomcat的主配置文件`server.xml`中定义的。 首先,打开Tomcat的安装目录,找到`conf`子目录下的`server....

    Tomcat中配置数据源所需得jar包

    现在,回到主题——"Tomcat中配置数据源所需得jar包"。在`lib`目录下,你可能需要以下jar包: 1. 数据库驱动jar包:例如,如果你使用的是MySQL,你需要将`mysql-connector-java.jar`放入Tomcat的`lib`目录。这样,...

    Tomcat配置数据源连接池示例

    总结来说,Tomcat配置数据源连接池是一个关键步骤,它可以显著提升应用程序处理数据库请求的能力。通过合理配置连接池参数,可以有效防止资源浪费,确保系统稳定运行。HikariCP因其高性能和易用性,成为许多开发者的...

    JSP入门必看实例——销售管理系统

    **JSP入门必看实例——销售管理系统** 销售管理系统是一个典型的Web应用程序,用于管理和跟踪销售相关的数据,如产品信息、订单、客户详情等。本实例基于MVC(Model-View-Controller)开发模式,该模式是Web应用...

    关于给Tomcat设置maxPostSize的问题及注意事项

    在使用Tomcat的过程中,有时我们需要处理大文件上传或者大数据量的POST请求,这时就涉及到一个关键的配置参数——`maxPostSize`。本文将详细解析`maxPostSize`的含义、设置方法以及在不同版本Tomcat中的注意事项。 ...

    数据库开发这点事——人生需要引导

    根据提供的文件信息,本书《数据库开发这点事——人生需要引导》是一本专注于介绍数据库应用与J2EE开发的入门级教程。以下将对该书的主要知识点进行详细的解析。 ### 一、J2EE基础概述 #### 1.1 J2EE简介 J2EE...

    HTTP拒绝服务整改方案

    - **TOMCAT:** 修改`/conf/server.xml`配置文件中的`connectionTimeout`参数,将其设置为较低的值(如7000ms或更低)。这可以减少非法连接占用的时间长度,提高服务器清理无效连接的效率。 ```xml ...

    JavaWeb课程设计——图书馆管理系统.doc

    【JavaWeb课程设计——图书馆管理系统】是一个典型的JavaWeb应用程序,旨在通过实践巩固并应用所学的JavaWeb技术,同时引入设计模式(GoF)的概念,提高系统的可维护性和可扩展性。在这个系统中,学生需要实现一个...

    Struts原理与实践 ——

    - 对于Java Web应用程序来说,可以在Tomcat服务器配置文件server.xml中设置connection pool的connectionProperties属性来指定连接数据库时的字符集编码,例如:`connectionProperties=useUnicode=true;...

    JavaWeb课程设计——图书馆管理系统.docx

    ### JavaWeb课程设计——图书馆管理系统知识点总结 #### 一、实验目的 本次实验的主要目标是在实践过程中深化对JavaWeb技术的理解,并初次应用设计模式(GoF),以体会其带来的优势。此外,还将结合数据库技术,...

    Java学习路线(csdn)————程序.pdf

    10. **JDBC API**:使用JDBC进行数据库操作,包括Connection、Statement、ResultSet接口,DriverManager类,PreparedStatement和CallableStatement接口,以及批处理和存储过程调用。 **Java面向对象企业级应用核心...

    MyStore.rar

    《Servlet工作流程详解与数据库连接实践——以MyStore项目为例》 Servlet是Java Web开发中的核心组件,主要用于处理客户端请求并生成动态响应。在MyStore项目中,我们深入探讨了Servlet的工作流程,以及如何实现...

    JAVA初级教程——Web系统开发技术与方法

    【JAVA初级教程——Web系统开发技术与方法】涵盖了Web编程的多个核心领域,旨在帮助初学者建立起完整的Web系统开发知识体系。以下是对每个知识点的详细解释: 1. **Web编程基本知识**: - **HTML**是超文本标记...

    LoginModel.zip_baby898_java_myeclipse_noseev3

    使用java.sql.DriverManager类加载驱动,然后调用Connection接口的connect()方法建立连接。编写SQL语句进行增删改查操作。 5. **Servlet处理**:创建Servlet类,如"LoginServlet"和"RegisterServlet",分别处理登录...

Global site tag (gtag.js) - Google Analytics